Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 比较两个列表中的元素_Haskell - Fatal编程技术网

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 我事

我在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作为元素的列表。

您可以
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
    提供两个参数,而不是为
    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”***可能指的是: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