Haskell 比较两个列表中的元素
我在Haskell做作业,我需要一个元素一个元素地比较两个列表,并计算有多少元素是相同的,在同一个地方:第一个列表的第一个元素和第二个列表的第一个元素,等等 以下是我所拥有的:Haskell 比较两个列表中的元素,haskell,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 我事
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作为元素的列表。您可以zip
这两个列表,然后在生成的元组列表上进行比较
map(uncurry compare)$zip l1 l2
假设您有两个列表l1
和l2
并计算所有具有相同元素的位置
长度$filter(=EQ)$map(未修正比较)$zip l1 l2
您可以压缩这两个列表,然后比较生成的元组列表
map(uncurry compare)$zip l1 l2
假设您有两个列表l1
和l2
并计算所有具有相同元素的位置
长度$filter(=EQ)$map(未修正比较)$zip l1 l2
您的代码存在以下问题:
- 模式:您正在定义
compare[a][b]
,但您希望a
和b
成为列表,因为您将它们与head
和tail
一起使用。只需定义比较一个b
- 模式顺序:第一场比赛获胜,因此您的
compare[]b=0
应该排在第一位
compare(tail a tail b)
应该为compare
提供两个参数,而不是为tail
提供三个参数<代码>比较(尾部a)(尾部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
您的代码存在以下问题:
- 模式:您正在定义
,但您希望compare[a][b]
和a
成为列表,因为您将它们与b
和head
一起使用。只需定义tail
比较一个b
- 模式顺序:第一场比赛获胜,因此您的
应该排在第一位compare[]b=0
应该为compare(tail a tail b)
提供两个参数,而不是为compare
提供三个参数<代码>比较(尾部a)(尾部b)tail
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
不明确的变量出现“compare”***可能指的是:Main.compare Hugs.Prelude.compare我现在遇到了这个错误。@kostathanasis:这意味着您已经在程序的
Main
(默认)模块中定义了compare
,但是Hugs.Prelude
(默认情况下导入的标准库部分)已经定义了一个名为compare
的函数,因此当您使用compare
时,编译器无法分辨您指的是哪一个。你可以:1。说导入前奏隐藏(比较)
(至少在GHC Haskell中-我不知道拥抱),2。将比较重命名为其他名称,或3。调用函数时,请使用完全限定名Main.compare
。不明确的变量出现“compare”***可能指的是:Main.compare Hugs.Prelude.compare我现在遇到了这个错误。@kostathanasis:这意味着您已经在程序的Main
(默认)模块中定义了compare
,但是Hugs.Prelude
(默认情况下导入的标准库部分)已经定义了一个名为compare
的函数,因此当您使用compare
时,编译器无法分辨您指的是哪一个。你可以:1。说导入前奏隐藏(比较)
(至少在GHC Haskell中-我不知道拥抱),2。将比较重命名为其他名称,或3。使用完全限定名Main。调用函数时比较。可以使用以下一行代码:length$filter(True==)$zipWith(=)ab
可以使用以下一行代码:length$filter(True==)$zipWith(=)ab