我正在编写一个函数,它按列表检查其中的所有元素是否恰好在另一个列表中。我的尝试:
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 类型:字符 * 不匹配:字符 - >布尔
想法?
答案 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 . (==)