Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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的新手,正在学习一些简单的递归函数。我正在处理一个函数“exists”,它接受一个值和一个元组。如果给定的值包含在元组中,我应该返回true。我看过其他类似的问题,但找不到解决办法。任何帮助都将不胜感激 我创建了一个helper函数existsHelper,它接受值和列表作为参数,并递归检查值是否存在。我不断收到一个错误,说明无法将预期类型[t]->Bool与实际类型Bool匹配 一些示例输入/输出 λ> exists 1 [] false λ> exists 'e

我是Haskell的新手,正在学习一些简单的递归函数。我正在处理一个函数“exists”,它接受一个值和一个元组。如果给定的值包含在元组中,我应该返回true。我看过其他类似的问题,但找不到解决办法。任何帮助都将不胜感激

我创建了一个helper函数existsHelper,它接受值和列表作为参数,并递归检查值是否存在。我不断收到一个错误,说明无法将预期类型[t]->Bool与实际类型Bool匹配

一些示例输入/输出

λ> exists 1 []
false
λ> exists 'e' "Hello"
true
λ> exists [4] [[3], [2], [4]]
true

您的exists函数具有以下类型:

exists :: Eq t => t -> [t] -> Bool
这定义了两个参数——实现Eq typeclass的某种类型的元素和该元素的列表注意:列表和元组是不同的。元组是固定大小的异构集合,而列表具有任意长度,其中所有元素都具有相同的类型

existsHelper函数也具有此类型并实现所需的行为,因此您可以简单地重命名它:

exists :: Eq t => t -> [t] -> Bool
exists p [] = False  
exists p (x:xs) = if (p == x) then True else (exists p xs)

您的exists函数具有以下类型:

exists :: Eq t => t -> [t] -> Bool
这定义了两个参数——实现Eq typeclass的某种类型的元素和该元素的列表注意:列表和元组是不同的。元组是固定大小的异构集合,而列表具有任意长度,其中所有元素都具有相同的类型

existsHelper函数也具有此类型并实现所需的行为,因此您可以简单地重命名它:

exists :: Eq t => t -> [t] -> Bool
exists p [] = False  
exists p (x:xs) = if (p == x) then True else (exists p xs)

exists函数只有一个参数,但类型签名指定了两个参数。您还说您的函数接受一个元组,但在类型签名或尝试的实现中看不到元组。我认为您正在试图找到一个函数的实现,该函数检查元素是否在列表中,这肯定不涉及元组。你正在使它变得比你需要的更复杂。助手已经完成了您想要的所有工作,不需要另一个函数。@Alex,在c中不一定是列表,它只是t类型的元素。xs是类型为[t]的列表。我们之所以知道这一点,是因为:具有类型签名a->[a]->[a]-它接受一个元素和一个列表,并返回将该元素前置到列表的结果。我不知道你为什么要再次谈论元组,我重申这里根本没有元组。除此之外,@chi已经说过,你已经解决了这个问题,因为你的existsHelper做的正是你想要exists做的-试试看,你会发现。你的exists函数只有一个参数,但类型签名指定了两个。你还说你的函数接受了一个元组,但在类型签名或尝试的实现中看不到元组。我认为您正在试图找到一个函数的实现,该函数检查元素是否在列表中,这肯定不涉及元组。你正在使它变得比你需要的更复杂。助手已经完成了您想要的所有工作,不需要另一个函数。@Alex,在c中不一定是列表,它只是t类型的元素。xs是类型为[t]的列表。我们之所以知道这一点,是因为:具有类型签名a->[a]->[a]-它接受一个元素和一个列表,并返回将该元素前置到列表的结果。我不知道你为什么要再次谈论元组,我重申这里根本没有元组。除此之外,@chi已经说过,您已经解决了这个问题,因为您的existsHelper完全执行您希望exists执行的操作—尝试一下,您就会看到。您还可以将第二行写成simply exists px:xs=p==x | | exists pxs。您还可以将第二行写成simply exists px:xs=p==x | | exists pxs。