2013-10-07 28 views
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 

返回

错误类型应用 *表达:过滤器n CA 期限:N 类型:字符 *不匹配:字符 - >布尔

想法?

+0

'滤波器写为n cA'需要'N'是一个函数,但是你提供的'Char'。你可以通过用'(== n)'替换'n'来做到这一点。 –

+0

在那里失去了什么,(== n)是什么? – MrD

+0

'(== n)'是'm == n'的一部分 - 与'(==)m n'相同。这里'(==)'是两个参数的函数,所以'(== n)'是一个参数的函数,如果'm == n',给定一个'm'产生'True'。 –

回答

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 . (==) 
+0

谢谢! :D这工作!还有一个问题,是否有一些简单的方法在函数中加入一个检查来查看两个列表的长度是否相等? – MrD

+0

@DarioP什么两个列表? – jozefg

+0

用于调用“过滤器”的cA列表以及作为验证函数的参数给出的原始列表 – MrD