Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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中定义一个函数,如果它是由';a';,否则就错了_Haskell_Pattern Matching - Fatal编程技术网

在Haskell中定义一个函数,如果它是由';a';,否则就错了

在Haskell中定义一个函数,如果它是由';a';,否则就错了,haskell,pattern-matching,Haskell,Pattern Matching,我是Haskell的新手,我正在尝试编写一个函数,它接受一个列表并返回bool 如果其输入列表仅由'a'组成,则返回True,否则返回False 这是我最好的猜测: f :: [a] -> Bool f ('a':[]) = True f (x:xs) = False 这无法编译并返回: Couldn't match type `a' with `Char' `a' is a rigid type variable bound by the type signatur

我是Haskell的新手,我正在尝试编写一个函数,它接受一个列表并返回bool

如果其输入列表仅由
'a'
组成,则返回
True
,否则返回
False

这是我最好的猜测:

f :: [a] -> Bool

f ('a':[]) = True

f (x:xs) = False
这无法编译并返回:

Couldn't match type `a' with `Char'
  `a' is a rigid type variable bound by
      the type signature for f :: [a] -> Bool at charf.hs:6:1
In the pattern: 'b'
In the pattern: 'b' : []
In an equation for `f': f ('b' : []) = True
我的逻辑有什么错误

f :: [Char] -> Bool
f ['a'] = True
f _ = False

使用模式匹配。您的函数似乎无法处理空列表。此外,您的函数不能像您希望的那样是泛型的,因为它显然需要一个
[Char]
(或
字符串
)。

如果要创建一个函数来测试列表是否包含单个给定值,则需要进行一些更改

首先,您需要提供要比较的预期值。目前,您正试图与
Char
'a'进行比较,但无法将
Char
与某个未知类型的
a
进行比较。其次,该类型需要是
Eq
类的一个实例,以便进行比较

您可以根据一个单例列表进行模式匹配,然后添加一个子句以将该元素与您期望的元素进行比较,例如

isSingletonOf :: Eq a => a -> [a] -> Bool
isSingletonOf v [s] | v == s = True
isSingletonOf _ _ = False
然后您可以创建一个函数来比较
[Char]

f :: [Char] -> Bool
f = isSingletonOf 'a'

您还可以使用Data.List中定义的函数
elem

这里是文档链接:

(如果您想了解它是如何实现的,可以单击该行末尾的source)

f::[Char]->Bool

f=elem'a'

关于
地图类型的回答
。正如你所说:
map::(a->b)->[a]->[b]


toUpper::Char->Char

因此
map-toUpper::[Char]->[Char]

如果要定义函数
g::String->Int
,则
map g::[String]->[Int]


如您所见,根据您作为
map
的第一个参数提供的函数,结果函数的输入和输出类型可能相同,也可能不同。

您的意思是列表中应该只包含一个
Char
'a'?在这种情况下,函数的类型应该是
[Char]->Bool
。现在签名允许任何类型的列表,这就是为什么会出现错误。请注意,您可以简单地使用
fx=x==“a”
,或者更简洁地说
f=(==“a”)
[a]指代任何类型的列表,对吗?因此,我可以定义一个函数,它接受一个列表,如果第一个元素为“a”,则返回true,否则返回false,或者至少这是我的目标。您不能这样做,因为您显式使用了
字符。如果您试图使用alpha列表,则不能在签名中的任何位置指定类型。在map示例中,
a
可以与
b
的类型相同,但不一定相同。考虑<代码> map(const true)“fo”< /代码>。如果
map::(a->a)->[a]->[a]
,那么您实际上只能生成与原始列表类型相同的列表。@user2666425您可以在通用列表上进行模式匹配。你不能对元素类型做任何假设。当您在
a
周围加单引号时,您的意思是列表必须与
Char
匹配,其值为字符
'a'
。如果删除引号,则
a
将是一个匹配任何类型的变量,并且您的函数将在任意列表上工作。@user2666425我认为您对类型变量在Haskell中的工作方式有误解。类型
[a]
不是指“一个列表,其中的每个元素都可以是任何类型的值”,而是指“一个列表,其元素都是一个单一类型的值,可以是任何类型的值”。因此,当您处理该列表时,您只能对元素执行对任何类型的任何值都有效的操作。只有
Char
值可以与
'a'
进行模式匹配,因此您无法与该模式匹配(事实上,也不能与任何其他模式匹配)。