我正在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作为元素的列表。
答案 0 :(得分:3)
您的代码存在以下问题:
模式:您定义的是b
,但您希望head
和tail
成为列表,因为您正在使用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
假设您有两个列表l1
和l2
并计算所有具有相同元素的地方
length $ filter (== EQ) $ map (uncurry compare) $ zip l1 l2