功能签名问题

时间:2013-10-07 22:55:49

标签: haskell

我正在编写一个函数,它按列表检查其中的所有元素是否恰好在另一个列表中。我的尝试:

cA = ['A', 'B', 'C', 'D'] {- original list -}

validate :: [Char] -> Bool
validate (n:[]) = if length (filter n cA) == 1 then True else False
validate (n:m) = if length (filter n cA) == 1 then validate m else False

返回

在应用程序中输入错误 *表达式:过滤器n cA 期限:n 类型:字符 * 不匹配:字符 - >布尔

想法?

1 个答案:

答案 0 :(得分:4)

首先,如果你看到自己写作

,请小心
if foo then True else False

停止并写下

foo

其次,n的类型是Char对吗?但过滤器期待Char -> Bool。这就是你的错误。我相信你想要

validate [n] = length (filter (==n) cA) == 1
validate (n:ns) = length (filter (==n) cA) == 1 && validate ns

(==n)\a -> a == n相同。这被称为操作员部分,它只是一些旧的Haskell糖。

哦,这可以使用函数all

编写
validate ns = all (\n -> length (filter (==n) cA) == 1) ns
validate' = all $ (==1) . length . flip filter cA . (==)