SORU
20 Ocak 2010, ÇARŞAMBA


Nasıl Kontrol kullanıyorsunuz.Temiz Haskell yazmak için uygulamalı?

Güncel answer to a style question, yazdım

main = untilM (isCorrect 42) (read `liftM` getLine)

ve

isCorrect num guess =
  case compare num guess of
    EQ -> putStrLn "You Win!" >> return True
    ...

Martijn yardımsever önerilen alternatifler:

main = untilM (isCorrect 42) (read <$> getLine)

EQ -> True <$ putStrLn "You Win!"

Ortak desen Haskell kodu net Control.Applicative soyutlamalar kullanarak yapılabilir? Yararlı ne başparmak Denetimi kullanmak için akılda tutulması gereken kurallar.Etkili bir şekilde uygulanabilir mi?

CEVAP
20 Ocak 2010, ÇARŞAMBA


Temelde, monadlar da uygulamalı funktorlar [1]. liftM, liftM2, vb kullanarak kendinizi bulmak zaman. yani, hesaplama birlikte <*> kullanarak zinciri. Bir anlamda, uygulamalı funktorlar fonksiyonlara benzer düşünebilirsiniz. Saf bir fonksiyonu f f <$> x <*> y <*> z yaparak kaldırılabilir.

Monadlar göre, uygulamalı funktorlar argümanlar seçmeli olarak çalıştıramazsınız. Tüm değişkenler yan etkileri yer alacak.

import Control.Applicative

ifte condition trueClause falseClause = do
  c <- condition
  if c then trueClause else falseClause

x = ifte (return True) (putStrLn "True") (putStrLn "False")

ifte' condition trueClause falseClause = 
  if condition then trueClause else falseClause

y = ifte' <$> (pure True) <*> (putStrLn "True") <*> (putStrLn "False")

x True, y oysa çıktıları True False sırayla tek çıktılar.

[1] The Typeclassopedia. Önerilen yüksek.

[2] http://www.soi.city.ac.uk/~ross/papers/Applicative.html. Bu akademik bir kağıt olmasına rağmen, onu takip etmek zor.

[3] http://learnyouahaskell.com/functors-applicative-functors-and-monoids#applicative-functors. Anlaşma çok iyi açıklıyor.

[4] http://book.realworldhaskell.org/read/using-parsec.html#id652399. Parsec kütüphane de uygulamalı bir şekilde nasıl kullanılabileceğini gösterir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Washington

    Adam Washing

    12 Mayıs 2006
  • GALERNAYA20

    GALERNAYA20

    19 NİSAN 2011
  • Murray Winiata

    Murray Winia

    2 ŞUBAT 2009