1

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

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

返回

应用程序中的类型错误 * 表达式:filter n cA 术语:n 类型:Char *不匹配:Char -> Bool

想法?

4

1 回答 1

4

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

if foo then True else False

停下来写

foo

二、类型nChar吗?但过滤器是期待的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 . (==)
于 2013-10-07T23:00:54.467 回答