Operator Titik di Haskell
Saya mencoba memahami apa yang dilakukan operator titik dalam kode Haskell ini:
sumEuler = sum . (map euler) . mkList
Jawaban singkat
Kode yang setara tanpa titik, itu adil
sumEuler = \x -> sum ((map euler) (mkList x))
atau tanpa lambda
sumEuler x = sum ((map euler) (mkList x))
karena titik (.) menunjukkan komposisi fungsi.
Jawaban yang lebih panjang
Pertama, mari kita sederhanakan penerapan parsial euler
untuk map
:
map_euler = map euler
sumEuler = sum . map_euler . mkList
Sekarang kita hanya punya titik-titiknya. Apa yang ditunjukkan oleh titik-titik ini?
Dari sumber :
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)
Dengan demikian (.)
adalah operator yang compose .
Menyusun
Dalam matematika, kita bisa menulis komposisi fungsi, f (x) dan g (x), yaitu, f (g (x)), sebagai
(f ∘ g) (x)
yang bisa dibaca "f tersusun dengan g".
Jadi di Haskell, f ∘ g, atau f yang terdiri dari g, bisa ditulis:
f . g
Komposisi bersifat asosiatif, yang berarti bahwa f (g (h (x))), yang ditulis dengan operator komposisi, dapat menghilangkan tanda kurung tanpa ambiguitas.
Artinya, karena (f ∘ g) ∘ h ekivalen dengan f ∘ (g ∘ h), kita cukup menulis f ∘ g ∘ h.
Berputar kembali
Kembali ke penyederhanaan kami sebelumnya, ini:
sumEuler = sum . map_euler . mkList
hanya berarti itu sumEuler
adalah komposisi yang belum diterapkan dari fungsi-fungsi tersebut:
sumEuler = \x -> sum (map_euler (mkList x))