首页 > 解决方案 > Haskell:等效的数组循环比较

问题描述

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

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

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

我希望在这里完成如下:

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

然而,输入两个链表和索引 3 将返回 0,因为第一个链表的四元组中的第 4 个字母都不匹配第二个链表的四元组中的任何第 4 个字母。

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

标签: haskell

解决方案


这就是我想出的:

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

推荐阅读