Haskellのドット演算子
私はこのHaskellコードでドット演算子が何をしているのかを理解しようとしています:
sumEuler = sum . (map euler) . mkList
簡潔な答え
ドットのない同等のコード、それはただ
sumEuler = \x -> sum ((map euler) (mkList x))
またはラムダなし
sumEuler x = sum ((map euler) (mkList x))
ドット(。)は関数の合成を示しているためです。
長い答え
まず、eulertoの部分適用を単純化しましょうmap:
map_euler = map euler
sumEuler = sum . map_euler . mkList
今、私たちはただ点を持っています。これらの点は何を示していますか?
ソースから:
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)
したがって(.)、作成演算子です。
作曲
数学では、関数の合成f(x)とg(x)、つまりf(g(x))を次のように書くことができます。
(f∘g)(x)
これは「fはgで構成されている」と読むことができます。
したがって、Haskellでは、f∘g、またはgで構成されたfは次のように書くことができます。
f . g
合成は結合法則です。つまり、合成演算子を使用して記述されたf(g(h(x)))は、あいまいさなしに括弧を省略できます。
つまり、(f∘g)∘hはf∘(g∘h)と同等であるため、f∘g∘hと簡単に書くことができます。
振り返る
以前の簡略化に戻ります。これは次のとおりです。
sumEuler = sum . map_euler . mkList
これsumEulerは、これらの関数の適用されていない構成であることを意味します。
sumEuler = \x -> sum (map_euler (mkList x))