在Haskell中定义一个函数,如果它是由'a'组成的列表则返回true,否则返回false

时间:2013-08-10 17:54:18

标签: haskell pattern-matching

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

我的逻辑错误是什么?

3 个答案:

答案 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的第一个参数提供的函数,结果函数在输入和输出中可能具有相同类型,也可能不具有相同类型。