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

  • CorridorDigital

    CorridorDigi

    17 Mayıs 2010
  • DroidModderX ROOT Master

    DroidModderX

    14 ŞUBAT 2011
  • xiaoyu85

    xiaoyu85

    20 ŞUBAT 2010