Haskell:数组循环比较等效



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

数组都有格式(假设...p 派生方程(:

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

我希望在这里完成如下:

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

  • 对于
  • 该索引,我想找出,对于 linkedList 1 中的每个四元组,该索引处的值与 linkedList 2 中每个四元组中同一索引处的值相同多少次。

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

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

任何建议如何实现这一目标/开始?我一直在尝试实现递归映射函数,但它的进展非常不稳定。

这是我想到的:

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

最新更新