Haskell:等效于数组循环比较

时间:2018-09-05 06:35:29

标签: haskell

我正在尝试比较两个链表的某些方面。

两个数组都具有格式(假设a ... p派生等式):

linkedList1 = [(a, b, c, d), (e, f, g, h)]
linkedList2 = [(a, f, k, l), (a, b, g, m)]

我希望在这里完成的工作如下:

  • 我想输入一个索引,以供每个四元组引用。

  • 对于该索引,我想为linkedList 1中的每个四倍查找该索引的值等于linkedList 2中每个四倍中的相同索引的值多少倍。 / p>

例如,在上面的链表中,输入两个链表和索引1将返回值2,作为链表1的第一个四倍中的第二个值=链链表2的第二个四倍中的第二个值。

但是,输入两个链表和索引3将返回0,因为第一个链表的四倍体中的第四个字母都不匹配第二个链表的双倍体中的任何四个字母。

任何建议如何实现这一目标/开始?我一直在尝试实现递归地图功能,但是进展非常缓慢。

1 个答案:

答案 0 :(得分:3)

这是我想出的:

howManyEqualAtIndex l1 l2 0
=> 2
howManyEqualAtIndex l1 l2 1
=> 2
howManyEqualAtIndex l1 l2 2
=> 1
howManyEqualAtIndex l1 l2 3
=> 0

l1 = [('a', 'b', 'c', 'd'), ('e', 'f', 'g', 'h')]
l2 = [('a', 'f', 'k', 'l'), ('a', 'b', 'g', 'm')]

--List comprehension checking all combinations.
--Predicate that they are equal
howManyEqualAtIndex xs ys idx = length [() | x<-xs, y<-ys, equalAt x y idx]

--Hardcoded for quads, can be extended to other n-tuples,
--or changed to list version commented out below
equalAt (a,_,_,_) (b,_,_,_) 0 = a == b
equalAt (_,a,_,_) (_,b,_,_) 1 = a == b
equalAt (_,_,a,_) (_,_,b,_) 2 = a == b
equalAt (_,_,_,a) (_,_,_,b) 3 = a == b

--equalAt :: (Eq a) =>  [a] -> [a] -> Int -> Bool
--equalAt xs ys idx = xs !! idx == ys !! idx