Haskell'de Nokta Operatörü
Nokta operatörünün bu Haskell kodunda ne yaptığını anlamaya çalışıyorum:
sumEuler = sum . (map euler) . mkList
Kısa cevap
Noktasız eşdeğer kod, yani
sumEuler = \x -> sum ((map euler) (mkList x))
veya lambda olmadan
sumEuler x = sum ((map euler) (mkList x))
çünkü nokta (.) işlev bileşimini gösterir.
Daha uzun cevap
İlk olarak, kısmi uygulama basitleştirmek izin euler
için map
:
map_euler = map euler
sumEuler = sum . map_euler . mkList
Şimdi sadece noktalara sahibiz. Bu noktalarla ne gösterilir?
Gönderen kaynağı :
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)
Bu nedenle (.)
bir oluşturma operatör .
Oluştur
Matematikte, f (x) ve g (x), yani f (g (x)) fonksiyonlarının bileşimini şöyle yazabiliriz:
(f ∘ g) (x)
"f, g ile oluşturulmuş" olarak okunabilir.
Yani Haskell'de, f ∘ g veya g ile oluşan f yazılabilir:
f . g
Kompozisyon ilişkiseldir, yani kompozisyon operatörü ile yazılan f (g (h (x))) parantezleri belirsizlik olmadan dışarıda bırakabilir.
Yani, (f ∘ g) ∘ h, f ∘ (g ∘ h) 'ye eşit olduğu için, basitçe f ∘ g ∘ h yazabiliriz.
Geri dönüyor
Daha önceki basitleştirmemize geri dönersek, bu:
sumEuler = sum . map_euler . mkList
sadece sumEuler
bu işlevlerin uygulanmamış bir bileşimi olduğu anlamına gelir :
sumEuler = \x -> sum (map_euler (mkList x))