4

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

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

我的逻辑有什么错误?

4

3 回答 3

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

使用模式匹配。您的函数似乎无法处理空列表。此外,您的函数不能像您想要的那样通用,因为它显然需要 a [Char](或 a String)。

于 2013-08-10T18:04:51.680 回答
1

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

首先,您需要提供要比较的预期值。目前您正在尝试与Char'a' 进行比较,但您无法将 aChar与某些未知类型进行比较a。其次,这种类型需要是Eq类的实例,以便您可以进行比较。

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

isSingletonOf :: Eq a => a -> [a] -> Bool
isSingletonOf v [s] | v == s = True
isSingletonOf _ _ = False

然后你可以创建一个函数来比较[Char]

f :: [Char] -> Bool
f = isSingletonOf 'a'
于 2013-08-10T18:42:34.163 回答
0

您还可以使用elemData.List 中定义的函数来执行此操作。

这里是文档链接:
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结果函数的第一个参数提供的函数,输入和输出的类型可能相同,也可能不同。

于 2013-08-10T19:41:53.990 回答