SORU
4 EYLÜL 2008, PERŞEMBE


Bir monad nedir?

Haskell de kısaca baktım, son dönemde, ne olurkısa, öz, pratikbir monad aslında ne gibi bir açıklama?

Oldukça ulaşılmaz olmak ve pratik ayrıntı eksik karşılaştığım en açıklamalar buldum.

CEVAP
11 EKİM 2008, CUMARTESİ


İlk: terimmonadbiraz eğer bir matematikçi değilse anlamsızdır. Alternatif bir terimdirhesaplama builderbiraz aslında yararlı olduklarını daha açıklayıcı.

Pratik örnekler için sorarsınız

Örnek 1: Liste üreteci:

[x*2 | x<-[1..10], odd x]

Bu ifade 1 ila 10 aralığında tüm tek sayıları iki katına verir. Çok yararlı!

Bu gerçekten sadece Liste monad içinde bazı operasyonlar için sözdizimsel şeker olduğu ortaya çıktı. Aynı liste anlama olarak yazılabilir:

do
   x <- [1..10]
   if odd x 
       then [x * 2] 
       else []

Hatta:

[1..10] >>= (\x -> if odd x then [x*2] else [])

Örnek 2: Giriş/Çıkış:

do
   putStrLn "What is your name?"
   name <- getLine
   putStrLn ("Welcome, "    name    "!")

Her iki örnek monadlar, AKA hesaplama yapanlar kullanır. Ortak tema monadzincirleri işlemleribazı özel faydalı şekilde. Liste anlama, işlemleri eğer bir işlem bir listesini verir, sonra aşağıdaki işlemleri gerçekleştirecek olan zincirleme gibiher öğelistesinde. IO monad diğer taraftan işlemlerini yapar sırayla, ama geçer bir "gizli değişken" birlikte, hangi temsil eder "devletin dünya", hangi verir bize yazın I/O kodu bir saf fonksiyonel bir şekilde.

Dışarı desen çıkıyorzincirleme operasyonlaroldukça kullanışlı ve pek çok farklı şey için kullanılır Haskell.

Bir diğer örnek ise özel durumlar: eğer bir hata bu durumda zincirin geri kalanını terk atılır, eğer hariç Error Kullanarak monad, operasyonları yapılmaktadır bu zincirleme böyle sırayla.

-Anlama liste sözdizimi ve her iki gösterimde yapmak zincirleme işlemler için sözdizimsel şeker >>= operatör kullanıyor. Bir monad temelde >>= operatör destekleyen sadece bir türüdür.

Örnek 3: Bir çözümleyici

Bu bir alıntı dize veya sayı ayrıştırır çok basit bir ayrıştırıcı

parseExpr = parseString <|> parseNumber

parseString = do
        char '"'
        x <- many (noneOf "\"")
        char '"'
        return (StringValue x)

parseNumber = do
    num <- many1 digit
    return (NumberValue (read num))

*, digit, *15 operasyon vb. oldukça basit. Onlar da maç ya da maç yok. Sihri kontrol akışını yöneten monad: işlemleri bir maç başarısız kadar sırayla, monad 17 ** son backtracks içinde yapılır ve bir sonraki seçeneği çalışır. Yine, bazı ek yararlı semantiği ile zincirleme operasyonların bir yol.

Örnek 4: Asenkron programlama

Yukarıdaki örnekler Haskell, ama F# da monadlar destekler çıkıyor. Bu örnek Don Syme çalınmış

let AsyncHttp(url:string) =
    async {  let req = WebRequest.Create(url)
             let! rsp = req.GetResponseAsync()
             use stream = rsp.GetResponseStream()
             use reader = new System.IO.StreamReader(stream)
             return reader.ReadToEnd() }

Bu yöntem bir web sayfası getirir. Espriyi GetResponseAsync - aslında ana iş parçacığı işlevi verir iken, ayrı bir iş parçacığı yanıt bekler. Son üç satır yanıt alındığında oluşturulan iş parçacığı üzerinde yürütülür.

Diğer birçok dilde açıkça yanıt işleme hatları için ayrı bir işlev oluşturmanız gerekir. async monad "" kendi bloğu ve ikinci yarısı. infaz erteleme bölme yapabiliyor (async {} sözdizimi bloğu denetim akışı async monad tarafından tanımlanmış olduğunu gösterir.)

Nasıl çalışıyorlar

Nasıl bir monad bütün bu süslü akış denetimi şey yapabilir? Aslında blok yapmak (ya . ne olur ^em>hesaplama ifadesiF dedikleri gibi#), her işlem (temelde her hattı ayrı anonim bir fonksiyon. sarılır Bu işlevler daha sonra kombine bind operatör (Haskell >>= yazılmış) kullanıyor. Beri bind çalışma birleştirir fonksiyonları, yürütme olarak görüyor fit: sırayla, birden çok kez, ters, atın biraz, yürütmek biraz üzerinde ayrı bir iş parçacığı zaman geliyor gibi.

Örnek olarak, bu örneği 2 IO-kod genişletilmiş bir sürümü

putStrLn "What is your name?"
>>= (\_ -> getLine)
>>= (\name -> putStrLn ("Welcome, "    name    "!"))

Bu çirkin, ama aslında neler olduğunu da daha açık. Sihirli unsur >>= operatörü: bir değerin (Sol tarafta) alır ve bir işlev (sağdaki) ile birleşir ve yeni bir değer üretmek için. Bu yeni bir değer >>= sonraki operatörü tarafından alınan ve tekrar yeni bir değer üretmek için bir fonksiyonu ile birleştirilir. >>= mini değerlendiricisi olarak görülebilir.

>>= farklı türleri için aşırı yüklendi, her monad >>= kendi uygulaması vardır unutmayın. (Zincirindeki tüm işlemleri, aksi takdirde >>= operatörü iş alışkanlık olsa aynı monad türü.)

En basit Olası uygulama >>= sadece gereken değeri sol geçerlidir ve bu işlevi doğru verir ve sonuç olarak söylemeden önce, ne yapar bütün desen yararlıdır olduğunda ekstra bir şeyler oluyor, monad uygulanması >>=.

Değerleri gelecek bir operasyon nasıl geçtiğini bazı ek zeka var, ama bu Haskell tür sistemi daha derin bir açıklama gerektirir.

Özetliyor

Haskell-açısından bir monad olan ^ tanımlayan Monad yazın sınıfının bir örneği olan parametrik yazın< . = birlikte birkaç diğer operatörler. Uzun lafın kısası, bir monad sadece kendisi için >>= işlemi tanımlanmış bir türüdür.

Kendisi >>= sadece hantal bir şekilde zincirleme fonksiyonları, ama varlığı-gösterimde olan gizler "tesisat", monadic işlemleri çıkacak bir çok güzel ve yararlı bir soyutlama, yararlı birçok yerde dilini ve oluşturmak için yararlı kendi mini-diller dil.

Neden monadlar zor?

Haskell-öğrenciler, monadlar çoğu için bir tuğla duvar gibi vurdular bir engel. Karmaşık kendilerini, ama uygulama parametreli tip sınıflar, vb gibi birçok gelişmiş özellikleri Haskell dayanan monadlar öyle değil. Asıl sorun Haskell G/Ç dayanır monadlar, ve I/O muhtemelen bir ilk şeyleri istediğini anlamak için zaman öğrenme yeni bir dil sonuçta, değil çok eğlenceli oluşturmak için hangi programlar değil üretmek herhangi bir çıkış. Yumurta-tavuk bu soruna kısa vadede bir çözüm gibi g/Ç tedavisinde "sihirli burada dilin diğer bölümleri ile yeterince tecrübe kazanana dek". olur dışında var Özür dilerim.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bigky226

    bigky226

    11 HAZİRAN 2006
  • OVERWERK

    OVERWERK

    6 Temmuz 2010
  • superemposed

    superemposed

    25 Aralık 2007