1

リストを取得して、その中のすべての要素が別のリストに正確に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 に答える