Haskell で単純な平均関数を開発しようとしています。これはうまくいくようです:
lst = [1, 3]
x = fromIntegral (sum lst)
y = fromIntegral(length lst)
z = x / y
しかし、次のバージョンが機能しないのはなぜですか?
lst = [1, 3]
x = fromIntegral.sum lst
y = fromIntegral.length lst
z = x / y
Haskell で単純な平均関数を開発しようとしています。これはうまくいくようです:
lst = [1, 3]
x = fromIntegral (sum lst)
y = fromIntegral(length lst)
z = x / y
しかし、次のバージョンが機能しないのはなぜですか?
lst = [1, 3]
x = fromIntegral.sum lst
y = fromIntegral.length lst
z = x / y
.
(合成) は関数適用よりも優先度が低いため、
fromIntegral.sum lst
と解釈されます
fromIntegral . (sum lst)
関数ではないため、これは間違ってsum lst
います。
Haskell の演算子の優先順位規則につまずいて混乱しています。
あなたが書くとき
x = fromIntegral.sum lst
Haskell はそれを次のように見なします。
x = fromIntegral.(sum lst)
あなたが書くつもりだったのは:
x = (fromIntegral.sum) lst
「 $をレスキューに追加したかっただけです! 」:
x = fromIntegral $ sum lst
y = fromIntegral $ length lst
優先順位が最も低く、括弧レベルが多すぎるのを避けるためにあります。(。)とは異なり、関数の合成は行わず、右側の引数を評価して左側の関数に渡します。タイプはそれをすべて言います:
($) :: (a -> b) -> a -> b
(.) :: (b -> c) -> (a -> b) -> a -> c