15

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
4

3 に答える 3

17

.(合成) は関数適用よりも優先度が低いため、

fromIntegral.sum lst

と解釈されます

fromIntegral . (sum lst)

関数ではないため、これは間違ってsum lstいます。

于 2010-05-14T13:58:36.930 に答える
17

Haskell の演算子の優先順位規則につまずいて混乱しています。

あなたが書くとき

x = fromIntegral.sum lst

Haskell はそれを次のように見なします。

x = fromIntegral.(sum lst)

あなたが書くつもりだったのは:

x = (fromIntegral.sum) lst
于 2010-05-14T13:59:25.197 に答える
11

「 $をレスキューに追加したかっただけです! 」:

x = fromIntegral $ sum lst
y = fromIntegral $ length lst

優先順位が最も低く、括弧レベルが多すぎるのを避けるためにあります。(。)とは異なり、関数の合成は行わず、右側の引数を評価して左側の関数に渡します。タイプはそれをすべて言います:

($) :: (a -> b) -> a -> b
(.) :: (b -> c) -> (a -> b) -> a -> c
于 2010-05-14T14:23:52.360 に答える