2011-12-31 9 views
1

私はGHCiで素早く1ライナーを書いていて、マップで合計を作ろうとしました。私は、mapが一般的な型[b]の出力を与えるのに対し、sumは特定の入力Num a => [a]を取るのに対し、失敗した理由を理解しました。しかし、マップ関数の出力がタイプNum b => [b]であると仮定して、このコードには何も問題はありません。Haskell:一般的なタイプの特定のタイプの関数を作成しますか?

私は規制型宣言がうまくいくかもしれない書き込みを考え(私が推測するが、それはGHCiの中でそれをやってからあなたを防ぐ)それはまだしませんでした:

myFunc :: Num b => (a -> b) -> [a] -> b 
myFunc = sum . map 

は私に次のエラーを与えた:

Couldn't match expected type `[[a] -> b]' 
      with actual type `[a] -> [b]' 
Expected type: (a -> b) -> [[a] -> b] 
    Actual type: (a -> b) -> [a] -> [b] 
In the second argument of `(.)', namely `map' 
In the expression: sum . map 

これを行う方法はありますか?たぶん私はちょうど何か明白な(ハスケルに新しい)行方不明です。

+2

myFunc f = sumを試してください。マップf '。 '(。)'は単項関数を構成します。 –

答えて

5

sum . mapあなたが探している定義ではありません。

(.) :: (b -> c) -> (a -> b) -> a -> c 

ドット演算子は2つの単項機能を受け入れることを確認します。それはmapとして動作しない2つの引数を取ります。可能な解決策の

map :: (a -> b) -> [a] -> [b] 

一つは、明示的にmapの最初の引数をバインドするために、次のようになります。

myFunc :: Num c => (a -> c) -> [a] -> c 
myFucc f = sum . map f 

また、あなたがcurryuncurryを使用して達成できます同じ結果。

myFunc = curry $ sum . uncurry map 
+3

もう一つのポイントフリー定義は '(合計)です。 map'または 'sum。:map'ここで'(。:) =(。)。 (。) '。 –

+1

"dot演算子は2つの単項関数を受け入れますが、機能しません..."まあすべての関数は技術的に単項関数です。 "複数引数"関数は他の関数を返す単なる関数です。マップは2つの引数を取るので、 "うまくいきません"。それは単にOP以外の方法で動作します – newacct

関連する問題