我是Haskell的新手,我正在尝试编写一个带有列表并返回bool的函数。
如果其输入列表是仅包含True
的列表,则会返回'a'
,否则会返回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
我的逻辑错误是什么?
答案 0 :(得分:7)
f :: [Char] -> Bool
f ['a'] = True
f _ = False
使用模式匹配。您的函数似乎没有处理空列表。此外,您的功能不能像您想要的那样通用,因为它显然需要[Char]
(或String
)。
答案 1 :(得分:1)
如果要创建一个函数来测试列表是否包含单个给定值,则需要进行一些更改。
首先,您需要提供要比较的预期值。目前,您尝试与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'
答案 2 :(得分:0)
您还可以使用Data.List中定义的函数elem
来执行此操作。
这是文档链接:
http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-List.html#v:elem
(如果你想看看它是如何实现的,你可以点击行尾的来源)
f :: [Char] -> Bool
f = elem 'a'
关于map
类型的答案。正如你所说:
map :: (a -> b) -> [a] -> [b]
和
toUpper :: Char -> Char
因此
map toUpper :: [Char] -> [Char]
如果你要定义一个函数g :: String -> Int
,那么
map g :: [String] -> [Int]
如您所见,根据您作为map
的第一个参数提供的函数,结果函数在输入和输出中可能具有相同类型,也可能不具有相同类型。