私は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の新機能)。