SORU
23 Mart 2009, PAZARTESİ


Bir yardım C# geliştirici anlamak: bir monad Nedir?

Monadlar hakkında konuşmak bu gün bir çok şey var. Birkaç makale / blog yazıları okudum ama yeterince tam bir kavram kavramak için örnekler ile gidemem. Nedeni monadlar dil işlevsel bir kavram olduğunu ve bu nedenle, bu örnekler ile derinlemesine işlevsel bir dil kullanmadım beri () çalışmadım dilde. Sözdizimi makaleler tam olarak takip etmek için yeterince derin bir bilgim yok. ama bir şey var anlama değer var söyleyebilirim.

Ancak, biliyorum C# çok iyi, lambda ifadeleri ve diğer fonksiyonel özellikleri de dahil olmak üzere. C biliyorum# sadece fonksiyonel özellikleri bir alt kümesi vardır, ve monadlar C olarak ifade edilebilir. belki bu yüzden#.

Ancak, bu kesinlikle mümkün kavramı yansıtmak için değil mi? En azından öyle umuyorum. Belki bir C sunabilirsiniz# bir temel olarak örnek ve ne güzel bir tarif o zaman C# geliştirici olurkeşkeoradan yapabilirdi ama dili nedeniyle fonksiyonel programlama özellikleri yoksun. Bu niyet ve monadlar yararları vermiş oluruz çünkü harika olurdu. Burada benim sorum şu:# 3 C geliştirici için monadlar vermek senin açıklaman nedir?

Teşekkürler!

(EDİT: bu arada, "monad" soru zaten. en azından 3 olduğunu biliyorum Ancak, onlarla aynı sorunla karşı karşıyayım ... bu soru ımo, C nedeniyle gerekli olduğunu#geliştirici odak. Teşekkürler.)

CEVAP
23 Mart 2009, PAZARTESİ


Programlama tüm gün ne çoğu birlikte bazı işlevler onlardan daha büyük işlevler oluşturmak için bir araya. Genellikle yalnızca işlevleri araç ama aynı zamanda diğer şeyler gibi operatörleri, değişken atamaları ve benzeri, ama genel olarak programınızı araya araya bir sürü "hesaplamaları" için büyük hesaplamaların hepsi bir araya getirerek daha fazla.

Bir monad bunu yapmak için bir yol olduğunu "hesaplamaları birleştiren".

Genellikle en temel "operatörü iki hesaplamaları bir araya" ;

a; b

Ne demek bu "derken ilk a, yap o zaman yap b". Sonuç a; b temel olarak daha fazla şeyler ile birlikte kombine edilebilir bir hesaplama. Bu basit bir monad, daha büyük olanlar için küçük hesaplamaları penye bir yoldur. ; diyor "solda olanı yap, doğru olanı yap o zaman".

Nesne yönelimli dillerde bir monad olarak görülebilir başka bir şey .. Genellikle bu gibi şeyler bulabilirsiniz:

a.b().c().d()

. "soldaki hesaplama değerlendirmek, ve bunun sonucu, sağ tarafta yöntemini çağırın". temelde anlamına gelir Fonksiyonları hesaplamaları birlikte, ; daha karmaşık birleştirmek için başka bir yoludur. Ve birlikte bir şeyler . ile zincirleme kavramı iki hesaplamaları yeni bir hesaplama için bir araya birleştiren bir yol olduğu için bir monad.

Özel bir sözdizimi olan oldukça yaygın bir monad, bu desen

rv = socket.bind(address, port);
if (rv == -1)
  return -1;

rv = socket.connect(...);
if (rv == -1)
  return -1;

rv = socket.send(...);
if (rv == -1)
  return -1;

-1 dönüş değeri bir hata gösterir, ama eğer bu şekilde birleştirmek için gereken API-çok ihbar varsa bile bu hata denetimi soyut, gerçek bir yolu yoktur. Bu temelde kural tarafından işlev çağrıları bir araya getiren başka bir monad "ise soldaki işlev -1, -1 kendimizi geri döndü, aksi takdirde sağ fonksiyon çağrısı". Eğer bu şey yaptım 17 ** bir operatör olsaydı sadece yazabiliriz:

socket.bind(...) >>= socket.connect(...) >>= socket.send(...)

İşler daha kolay okunur hale getirmek ve kendimizi defalarca tekrar etmeye gerek yok, böylece dışarı birleştiren fonksiyonları özel yolumuza soyut, yardımcı olur.

Ve orada çok daha fazla yolu birleştirme fonksiyonları hesaplamaları yararlı olan bir genel desen ve soyutlanmış bir monad, etkinleştirme kullanıcı monad yazmak çok daha kısa ve net kodu beri bütün defter tutma ve yönetimi kullanılan fonksiyonları yapılır, monad.

Örneğin yukarıdaki >>= olabilir genişletilmiş "hata denetleme ve arama sağ tarafındaki yuvada var gibi girdi", böylece gerek yok, açıkça belirtmek socket birçok kez:

new socket() >>= bind(...) >>= connect(...) >>= send(...);

Resmi tanımı biraz daha karmaşık beri seni merak etme, o konuda nasıl sonuç bir fonksiyonu olarak bir giriş için bir sonraki, eğer bu işlevi gereken girdi ve o zamandan beri istediğiniz emin olmak için fonksiyonları birleştirmek içine sığacak şekilde deneyin birleştirerek onlara monad. Ama temel kavramı fonksiyonları birleştirmek için farklı yollar resmileştirmek.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • george sarintzotis

    george sarin

    2 Aralık 2007
  • Rayone GB

    Rayone GB

    14 Temmuz 2007
  • videoisunrelated

    videoisunrel

    5 Mart 2009