Haskellのドット演算子
-
26-09-2019 - |
質問
私は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の優先順位規則によってアップトリップなっています。
あなたが書くとき
x = fromIntegral.sum lst
Haskellは同じように、そのを見て
x = fromIntegral.(sum lst)
は、書き込みに何を意味するのかだっます:
x = (fromIntegral.sum) lst
他のヒント
.
(組成物)は、機能アプリケーションより低い優先順位を有するので、
fromIntegral.sum lst
は
と解釈されfromIntegral . (sum lst)
sum lst
は関数ではないので、間違っている。
私はちょうど追加したい "の$救助にの!" ます:
x = fromIntegral $ sum lst
y = fromIntegral $ length lst
これは、最も低い優先度を持っており、それがあまりにも多くの括弧のレベルを避けるためにあります。異なり、(。)、それは関数合成をしない、それは右に引数を評価し、左側の関数に渡すことに注意してください。タイプはそれをすべて言うます:
($) :: (a -> b) -> a -> b
(.) :: (b -> c) -> (a -> b) -> a -> c
所属していません StackOverflow