2017-01-02 9 views
0

はプレリュード関数を再定義することにより、折り目を使用する方法を学習しようとすると:地図と一緒にハスケルでカレー関数を使う方法は?

import Prelude hiding (sum, product, length, and, or, all, any, filter) 

は、これまでのところ私は、すべての作業まで持っているが、私はすべてが間違ってやっているかを把握することはできません。次のように私はそれを定義しています:

and :: [Bool] -> Bool 
and = foldr (&&) True 

... 

all :: (a -> Bool) -> [a] -> Bool 
all = and $ map 

をしかし、これはというエラーが表示されますよう

Probable cause: ‘map’ is applied to too few arguments 

は、私もそれを定義しようとしました:これは罰金コンパイル

and :: [Bool] -> Bool 
and = foldr (&&) True 

... 

all :: (a -> Bool) -> [a] -> Bool 
all f [xs] = and $ map f [xs] 

が、私はそれを呼び出すときに言う:

[1 of 1] Compiling Fold    (Fold.hs, interpreted) 
Ok, modules loaded: Fold. 
*Fold> all even [0,2,4,6] 
*** Exception: Fold.hs:17:1-29: Non-exhaustive patterns in function all 

私は理解していないので[xs]は空のものであってもリストにマッチしてはいけませんか?リストを含めることなく折りたたみをカレーすることはできますが、マップはできません。どんな助けもありがとう。

+1

あなたの最後のエラーがある@Carcigenicateからのコメントと同じです。パラメータと 'map'の引数から角括弧を削除するだけです。 – Carcigenicate

+3

回答者も質問者も実際にはそれほど悪いとは言えません。 – Carcigenicate

+0

@Carcigenicateああ、感謝してくれてありがとう – user6731064

答えて

2

機能アプリケーションを合成しました。これは役に立ちますか?実際に

all :: (a -> Bool) -> [a] -> Bool 
all fn = and . (map fn) 

が、これはあなたのコード+ `[XS]`単一要素のみをリストにマッチしますので

+0

票を落としていませんでしたが、私は、あなたが '関数のすべての非網羅的なパターン'エラーを説明して欲しいと思った人物を推測します。 – Alec

+1

@Simon Hこれは本当にありがとうございます。明らかに合成とアプリケーションをブラッシュアップする必要があります – user6731064

+0

注: 'fn'パラメータは' all =と 'でなければなりません。マップは正常です。 – Bakuriu

関連する問題