比较两个列表中的元素

时间:2017-03-22 22:28:28

标签: haskell

我正在Haskell做作业,我需要逐个元素地比较两个列表并计算在同一个地方有多少元素是相同的:第一个第一个列表的元素,第二个列表的第一个元素,等等。

这就是我所拥有的:

compare :: [Int]->[Int]->Int
compare [a] [b]= if head a == head b then 1 + compare (tail a tail b) else 0 + compare (tail a tail b)

compare [] [b] = 0

我事先知道它们都是8 Int s作为元素的列表。

2 个答案:

答案 0 :(得分:3)

您的代码存在以下问题:

  • 模式:您定义的是b,但您希望headtail成为列表,因为您正在使用compare a b和{ {1}}。只需定义compare [] b = 0即可。

  • 模式的顺序:第一场比赛获胜,因此您的compare (tail a tail b)应该是第一位。

  • compare应该为tail提供两个参数,而不是compare (tail a) (tail b)的三个参数。 compare :: [Int] -> [Int] -> Int compare [] _ = 0 compare a b = if head a == head b then 1 + compare (tail a) (tail b) else compare (tail a) (tail b)

全部告诉:

compare a = length . filter id . zipWith (==) a

-- this works too
compare a = sum . fromEnum . zipWith (==) a

虽然它可能不适合做作业,但知道你可以通过获得一个布尔列表来表明某些位置是否相等,将它们过滤为真值并获得结果长度,这可能会很有趣。 :

// navigator.serviceWorker.addEventListener('message', ... ) should work too
navigator.serviceWorker.onmessage = function (e) {
    // messages from service worker.
    console.log('e.data', e.data);
};

答案 1 :(得分:1)

您可以zip两个列表,然后比较生成的元组列表 map (uncurry compare) $ zip l1 l2假设您有两个列表l1l2

并计算所有具有相同元素的地方 length $ filter (== EQ) $ map (uncurry compare) $ zip l1 l2