Haskell nokta Operatörü: daha fazla açıklama gerek
Nokta operatörü bu Haskell kodu ne yaptığını anlamaya çalışıyorum:
sumEuler = sum . (map euler) . mkList
Tüm kaynak kodu aşağıda.
Benim anlayış
Nokta operatörü 5* *iki işlevi map euler
sonucu ve giriş olarak mkList
sonuç alıyor.
Ama, sum
işlev bağımsız değişkeni bir işlev değil, değil mi? Burada neler oluyor?
Ayrıca, (map euler)
ne yapıyor?
Kod
mkList :: Int -> [Int]
mkList n = [1..n-1]
euler :: Int -> Int
euler n = length (filter (relprime n) (mkList n))
sumEuler :: Int -> Int
sumEuler = sum . (map euler) . mkList
CEVAP
Sadece, .
konur işlevi kompozisyon, matematik gibi:
f (g x) = (f . g) x
Senin durumunda da böyle tanımlanabilir bu yeni fonksiyon sumEuler
oluşturma:
sumEuler x = sum (map euler (mkList x))
Bu tarzı örnek denir "nokta-ücretsiz" style -- işlev için bağımsız değişkenler göz ardı edilir. Bu birçok durumda daha net kodu için yapar. (Onu ilk gördüğünde grok için zor olabilir, ama bir süre sonra alışacaksınız. Ortak Haskell bir deyim.)
Eğer hala şaşkın iseniz, UNİX boru gibi bir şey .
ilgili yardımcı olabilir. f
'In çıkış g
'h
hale gelen s giriş, giriş, f < x | g | h
gibi komut satırı bu yaz. olur Haskell UNIX gibi |
, fakat "tersten" 22*--*. eserlerinde Bir liste işlerken bu oldukça faydalı gösterimde buluyorum. map (\x -> x * 2 10) [1..10]
sanki biraz hantal yapı yerine sadece ( 10) . (*2) <$> [1..10]
yazabilirsiniz. (Ve eğer sadece uygulamak istiyorsanız, bunun tek bir değer fonksiyonu; ( 10) . (*2) $ 10
. Tutarlı!)
Wiki biraz daha ayrıntı ile güzel bir yazı Haskell için: http://www.haskell.org/haskellwiki/Pointfree
Tip-Hokkabazlık ve (katı) Daha fazla/D...
Hata mesaj 'istenen türde bir vey...
Haskell: arasındaki fark . (nokta) ve ...
Neden gıt gıt protokolü-http-arka uç d...
linux sınırlayıcı için daha fazla boşl...