SORU
10 Mart 2009, Salı


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
10 Mart 2009, Salı


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'hhale 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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • B4ROK

    B4ROK

    1 EKİM 2008
  • GoProTutorials

    GoProTutoria

    18 NİSAN 2011
  • whiteboy7thst

    whiteboy7ths

    1 Temmuz 2009