SORU
25 Ocak 2015, Pazar


Neden monadlar ihtiyacımız var mı?

Benim düşünceme ünlü sorusunun cevabı "What is a monad?", özellikle de en iyileri seçildi, açıkça açıklamadan bir monad ne olduğunu anlatmaya çalışıyorumgerçekten neden gerekli olduğunu. Bir sorunun çözümü olarak açıklanabilir?

CEVAP
25 Ocak 2015, Pazar


Neden monadlar ihtiyacımız var mı?

  1. Program istiyoruzsadece kullanma fonksiyonlar. ("fonksiyonel programlama (FP)").
  2. O zaman, ilk olarak büyük bir sorunumuz var. Bu bir program var

    f(x) = 2 * x

    g(x,y) = x / y

    Nasıl diyebilir miyizne ilk yürütülecek? Nasıl fonksiyonları (örn . sıralanmış bir dizi oluşturabilir miyiz ^strong>bir program)kullanarak fonksiyonları daha fazla?

    Çözüm:oluşturma fonksiyonları. Eğer ilk isterseniz g f, f(g(x,y)) yazın. Bu, "program" bir işlevi de vardır: main = f(g(x,y)). TAMAM, ama ...

  3. Daha fazla sorun: bazı işlevlerbaşarısız olabilir(0 tarafından yani g(2,0), bölme). Var"özel durumlar" . hayır FP (istisna bir işlev değil). Nasıl çözeriz bunu?

    Çözüm: hadifonksiyonları iki dönüş için işler biraz izin ver: g : Real,Real -> Real (gerçek bir iki gerçek işlevi) yerine, g : Real,Real -> Real | Nothing ((gerçek ya da hiçbir şey) iki gerçek işlevi) izin verin.

  4. Ama işlevleri (basit) sadece dönmelidirbir şey.

    Çözüm: hadi iade edilmesi için yeni bir veri türü oluşturmak için bir "boks yazın" o belki de bir gerçek alır ya da sadece, bir şey yok. Dolayısıyla, g : Real,Real -> Maybe Real yapabiliriz. TAMAM, ama ...

  5. Şimdi 10 ** ne olacak? f Maybe Real bir tüketmeye hazır değildir. Ve, g Maybe Real tüketmek bağlarız her fonksiyonu değiştirmek istemiyoruz.

    Çözüm: hadi"/""/"" fonksiyonları . bağlantı oluştur "bağlanmak için özel bir işlevi var . Bu şekilde, arka planda, bir işlevi çıkışını takip eden bir beslemek için adapte edebiliriz.

    Bizim durumumuzda: g >>= f (Bağlan/oluştur f g). İstiyoruz >>= g'In çıkış teftiş ve, diye. Nothing sakın arama f dönüş Nothing; ya da aksine, özü kutulu Real yem f ile. (Bu algoritma sadece 25 ** Maybe türü) uygulamasıdır. Ayrıca >>= yazılı olması gerektiğini unutmayınsadece bir kez""(farklı kutusu farklı adapte algoritma). boks tipine göre

  6. Pek çok başka sorun, bu aynı modeli kullanarak çözülebilecek ortaya çıkar: 1. Bir "o dönüşü" g gibi farklı anlamları/değerleri, ve fonksiyonları/mağaza öngörülüyor "kutulu değerleri". kutusunu kullanın 2. Besteci/linker g >>= f g'fs çıkış giriş's f herhangi bir değişiklik hiç gerek yok. bağlama yardım

  7. Çözülebileceğini olağanüstü sorunları bu tekniği kullanarak

    • fonksiyonları sırayla her işlev, küresel bir devlet olması ("program") paylaşabilirsiniz: çözüm StateMonad.

    • Sevmiyoruz "saf olmayan işlevleri": işlevleri verimfarklıçıkış içinaynıgiriş. Bu nedenle, bu işlevler, onları tagged/kutulu bir değer döndürmek için yapım, mark: 34* *monad.

Toplam mutluluk!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DRDAnimation

    DRDAnimation

    28 EYLÜL 2012
  • MandMEvangelists

    MandMEvangel

    28 Ocak 2008
  • Phandroid

    Phandroid

    26 Ocak 2009