SORU
24 NİSAN 2010, CUMARTESİ


Düz Monad İngilizce? (FP arka plan için OOP programcı)

OOP bir programcı anlayacağı açısından (herhangi bir fonksiyonel programlama arka plan olmadan), bir monad nedir?

Ne sorunu çözüyor mu ve kullanılan en yaygın yerler nelerdir?

DÜZENLEME:

Aradığım anlayış biraz açıklığa kavuşturmak için, hadi OOP bir uygulamaya monadlar olduğunu FP bir uygulama dönüştürme olduğunu söylüyorlar. Port için OOP uygulaması monadlar sorumlulukları ne yapardın?

CEVAP
24 NİSAN 2010, CUMARTESİ


GÜNCELLEME: Bu soru * -- * 26 harika soru için teşekkür okuyabilir çok uzun blog bir dizi konu oldu!

OOP bir programcı anlayacağı açısından (herhangi bir fonksiyonel programlama arka plan olmadan), bir monad nedir?

Bir monad< . em ^"amplifikatör" türleribubelli kurallara itaat edervebazı işlemler sağladı.

İlk olarak, ne bir "tip amplifikatör"? Bu bir tür almak ve daha özel bir türü haline sağlayan bazı sistem yani. C örneğin,# Nullable<T> düşünün. Bu tür bir amplifikatör. Bir tür alın int deyip, şimdi olamaz null edilebilir bir türü için yeni bir yeteneği, yani ekleyin, önce sağlar.

İkinci bir örnek olarak, IEnumerable<T> düşünün. Tür bir amplifikatör. O lets sen almak Bir tür, ki string ve eklemek yeni bir yetenek bu tip, yani, şimdi bir dizi dizeleri dışında herhangi bir sayı tek dizeleri.

Bu ne "belirli kurallara"? Kısaca, orada yatan tip fonksiyonları güçlendirilmiş türü işlevsel bileşimi normal kurallara uyun böyle çalışmak için mantıklı bir yoldur. Eğer bu sayılar üzerinde bir işlevi varsa, örneğin, diyelim

int M(int x) { return x   N(x * 2); }

Nullable<int> ilgili fonksiyon tüm operatörler ve oraya çağırır birlikte "" daha önce yaptıkları bu. aynı şekilde iş yapabilir o zaman

(Bu çok belirsiz ve kesin olmayan; işlevsel kompozisyon bilgisi hakkında hiçbir şey kabul etmedi bir açıklama istedi.)

Bu ne "operasyon"?

  1. Orada yükseltilmemiş bir türde bir değer alır ve güçlendirilmiş türünde bir değer haline getirmek için bir yoldur.
  2. Orada işlevsel kompozisyon kuralları daha önce de belirtildiği uyan güçlendirilmiş işlem türü içine yükseltilmemiş işlem türü dönüştürmek için bir yoldur
  3. Orada genellikle bir şekilde yükseltilmemiş türü güçlendirilmiş tip geri almak için. (Bu son nokta bir monad için kesinlikle gerekli değil ama sık sık böyle bir operasyon var bu durumda.)

Yine örnek olarak Nullable<T> al. Kurucu Nullable<int> bir int açabilirsiniz. C# derleyicisi en null" eğer bunu yapmasaydın senin için, ama değil, kaldırma dönüşümü basittir: bir operasyon diyelim. "kaldırma ilgilenir

int M(int x) { whatever }

haline getirilmiştir

Nullable<int> M(Nullable<int> x) 
{ 
    if (x == null) 
        return null; 
    else 
        return new Nullable<int>(whatever);
}

Ve bir int geri dönüş Değeri int null bir özelliği ile yapılır.

Anahtar bit olan işlev dönüşümü. Null çalışmasını boş bir çalışma null -- yayar -- gerçek anlam dönüşümü yakalanır nasıl dikkat edin. Bu genelleme yapabiliriz. Sanırım sende bir işlev için int int, bizim gibi özgün M. Sen-ebilmek kolayca yapmak bir işlev alır ve bir int döndürür Nullable<int> çünkü sadece çalışma sonucu ile null yapıcı. Şimdi sipariş daha yüksek yöntem bu olduğunu varsayalım:

Nullable<T> Bind<T>(Nullable<T> amplified, Func<T, Nullable<T>> func)
{
    if (amplified == null) 
        return null;
    else
        return func(amplified.Value);
}

Bununla neler yapabileceğini gördün mü?İnt ve int döndürür, ya da int ve null döndürür bir int alan bir yöntem şimdi null mantığı uygulanabilir.

Ayrıca: iki yöntem olduğunu varsayalım

Nullable<int> X(int q) { ... }
Nullable<int> Y(int r) { ... }

ve onları yazmanızı istiyorum:

Nullable<int> Z(int s) { return X(Y(s)); }

O, Z, X ve Y kompozisyonu Ama int X, Y döndürür null bir int alır, çünkü bunu yapamazsınız. Ama o günden bu yana "" işlem, bu iş yapabilirsiniz: . bağlama var

Nullable<int> Z(int s) { return Bind(Y(s), X); }

Bir monad üzerinde bağlama işlemi güçlendirilmiş tür fonksiyonları beste çalışması yapan şeydir."Monad normal işlev kompozisyon kuralları koruyan; asıl fonksiyonu kimlik işlevleri sonuçlar beste, kompozisyon ilişkili olduğunu, ve bu yüzden yukarıda. ben handwaved" kuralları

C#, "" denir "". SelectMany Bağlama Sıra monad üzerinde nasıl çalıştığına bir göz atın. Üç şeye ihtiyacımız var: bir dizi içine bir değeri dönüş değeri bir dizi açmak ve dizileri. işlemleri bağlama Bu işlemler:

IEnumerable<T> MakeSequence<T>(T item)
{
    yield return item;
}
T Single<T>(IEnumerable<T> sequence)
{
    // let's just take the first one
    foreach(T item in sequence) return item; 
}
IEnumerable<T> SelectMany<T>(IEnumerable<T> seq, Func<T, IEnumerable<T>> func)
{
    foreach(T item in seq)
        foreach(T result in func(item))
            yield return result;            
}

Null monad kural "için bir araya iki işlevi üretmek nullables birlikte, kontrol edin eğer iç sonuçlarında null; ya giderse, üretmek null, gitmezse, o zaman çağrı dış bir sonuç". Null istenilen anlamlı. Sıra monad kuralı "birlikte dizileri üreten iki işlevi birleştirmek için, her eleman iç işlevi tarafından üretilen dış işlevi uygulamak ve ortaya çıkan dizileri bir arada". Bu monadlar temel mantığı/SelectMany yöntemleri bağlayacak yakalanır; bu gerçekten monad ne anlatır yöntemidemektir.

Daha iyisini de yapabiliriz. Dizeleri dizilerinde in dizileri, in ve sonuç alan bir yöntem olduğunu varsayalım. Bağlama işlemi ve farklı güçlendirilmiş tipleri dönüş, bir desteklediğimiz sürece diğer çıktıları maç bu fonksiyonların bileşimi sağlamak için genelleme yapabiliriz:

IEnumerable<U> SelectMany<T,U>(IEnumerable<T> seq, Func<T, IEnumerable<U>> func)
{
    foreach(T item in seq)
        foreach(U result in func(item))
            yield return result;            
}

Şimdi "tamsayılar. bir sıra halinde tek tek tamsayılar bu grup yükseltmek diyebiliriz Dizeleri, dizeleri dizisi için güçlendirilmiş bir grup içine bu özel tamsayı dönüştürmek. Şimdi her iki işlem birlikte koymak: dizeleri tüm dizileri birleştirme içine bir ayette bu grup yükseltmek." Monadlar sağlaroluştursenin amplifikasyonu.

Ne sorunu çözüyor mu ve kullanılan en yaygın yerler nelerdir?

Bunu sormaktan ziyade "sorunları singleton deseni çözmek nedir?", ama size bir şans vereceğim.

Monadlar genellikle gibi sorunları çözmek için kullanılır:

  • Bu tür için yeni yetenekler ve hala bu tür eski fonksiyonları yeni yetenekleri kullanmak için birleştirmek istiyorum.
  • İhtiyacım yakalamak için bir sürü operasyonlar türleri ve temsil bu operasyonları olarak birleştirilebilir nesneleri, bina daha büyük ve daha büyük kompozisyonlar kadar var sadece sağ dizi operasyon temsil, ve daha sonra lazım olmaya başladı sonuçlar dışında bir şey
  • Yan-etki eden işlemleri temiz bir şekilde yan etkiler nefret eden bir dili temsil etmek istiyorum

(Bunlar temelde aynı şeyi söylemenin üç yolu olduğunu unutmayın.)

C# tasarım. monadlar kullanır Daha önce de belirtildiği gibi, null desen çok benzer "belki monad". SERİ tamamen monadlar inşa edilir; "" yöntem semantik işlemleri kompozisyon ne yapıyor. SelectMany (Erik Meijer her SERİ işlevi aslında SelectMany tarafından uygulanabilir; her şey bir kolaylık olduğuna işaret düşkündür.)

Aradığım anlayış biraz açıklığa kavuşturmak için, hadi OOP bir uygulamaya monadlar olduğunu FP bir uygulama dönüştürme olduğunu söylüyorlar. OOP uygulama noktasını monadlar sorumlulukları için ne yapardın?

En OOP dil yeterince zengin tür bir sistem monad desen kendisini temsil etmek için doğrudan olmayan; genel türler daha yüksek bir tür bu tür destekler bu tür bir sistem gerek. Bunu deneyin olmaz. Daha doğrusu, ben olsam uygulamak genel türler temsil her monad, ve uygulama yöntemleri temsil eden üç işlem gerekir: bir dönüm değeri içine güçlendirilmiş bir değer, bir dönüm güçlendirilmiş değer bir değeri ve dönüştürme fonksiyonu yükseltilmemiş değerleri içine bir fonksiyonu güçlendirilmiş değerleri.

Başlamak için iyi bir yer C SERİ hayata geçirdik nasıl olur#. SelectMany yöntemi; sıra monad C nasıl çalıştığını anlamak için anahtardır çalışması#. Çok basit bir yöntem, ama son derece güçlü!

C-derinlik ve teorik olarak sağlam bir açıklama monadlar daha fazla#, ben çok meslektaşım bu konuda dyer'ın madde Wes tavsiye ederim. Bu makale sonunda "" benim için. tıklandığında bana monadlar açıkladı nedir

The Marvels of Monads

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dirty Loops

    Dirty Loops

    21 Mayıs 2007
  • hytchme

    hytchme

    9 Mart 2014
  • Drakinen

    Drakinen

    1 EYLÜL 2008