1

私はGHCiで簡単なワンライナーを書いていて、マップで合計を作成しようとしました. 失敗した理由は、 map が一般的なタイプ [b] の出力を与えるのに対し、 sum は特定の入力 Num a => [a] を受け取るためだと考えました。ただし、 map 関数の出力が型 Num b => [b] であると仮定すると、このコードに問題はありません。

私は制限型宣言を書くことはうまくいくかもしれないと思っていました (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

これを行う方法はありますか?たぶん、明らかな何かが欠けているだけです(Haskellの新機能)。

4

1 に答える 1

5

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

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

ドット演算子は、2 つの単項関数を受け入れます。map2 つの引数を取るため、機能しません。

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

可能な解決策の 1 つは、mapの最初の引数を明示的にバインドすることです。

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

curryまたは、 andを使用しuncurryて同じ結果を得ることができます。

myFunc = curry $ sum . uncurry map
于 2011-12-31T08:11:08.880 に答える