在Haskell中定义一个函数,如果它是由';a';,否则就错了
我是Haskell的新手,我正在尝试编写一个函数,它接受一个列表并返回bool 如果其输入列表仅由在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
'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'
进行模式匹配,因此您无法与该模式匹配(事实上,也不能与任何其他模式匹配)。