2013-10-07 29 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