Bir dil-agnostik kullanmak için gidiyorum açıklamasına ilk Monoids anlatan böyle monad'ların:
Bir monoid parametre olarak bir tür almak ve aynı tür dönmek fonksiyonların (kabaca) kümesidir.
Bir tek hücreli bir alan işlevler (kabaca) bir dizi sarma bir parametre olarak türüne ve aynı ambalaj tipini verir.
Bunların tanım değil, açıklama olduğunu unutmayın. Bu açıklamaya saldırmaktan çekinmeyin!
Yani bir OO dilinde, bir monad aşağıdaki gibi operasyon kompozisyonlarına izin verir:
Flier<Duck> m = new Flier<Duck>(duck).takeOff().flyAround().land()
Monad'ın içerdiği sınıftan ziyade bu işlemlerin anlambilimini tanımladığını ve kontrol ettiğini unutmayın.
Geleneksel olarak, bir OO dilinde, bu semantiği sağlamak için bir sınıf hiyerarşisi ve miras kullanırdık. Yani bir olurdu Bird
yöntemlerle sınıfı takeOff()
, flyAround()
ve land()
, ve Ördek olanlar miras olacaktır.
Ama sonra uçamayan kuşlarla başımız belaya girer, çünkü penguin.takeOff()
başarısız olur. İstisna atma ve işleme başvurmak zorundayız.
Ayrıca, Penguin'in bir olduğunu söyledikten sonra Bird
, örneğin bir hiyerarşisine sahipsek, çoklu kalıtımla ilgili sorunlarla karşılaşırız Swimmer
.
Esasen sınıfları kategorilere ayırmaya çalışıyoruz (Kategori Teorisi adamlarından özür dileriz) ve tek tek sınıflardan ziyade semantiği kategoriye göre tanımlamaya çalışıyoruz. Fakat monadlar bunu yapmak için hiyerarşilerden çok daha açık bir mekanizma gibi görünüyorlar.
Bu durumda, Flier<T>
yukarıdaki örnek gibi bir monadımız olacaktı:
Flier<Duck> m = new Flier<Duck>(duck).takeOff().flyAround().land()
... ve asla a Flier<Penguin>
. Bunun bir işaretleyici arayüzü ile olmasını önlemek için statik yazmayı bile kullanabiliriz. Veya kefalet için çalışma zamanı yetenek kontrolü. Ama gerçekten, bir programcı asla bir Pengueni Flier'e koymamalı, aynı anlamda asla sıfırla bölmemelidir.
Ayrıca, daha genel olarak uygulanabilir. Bir pilotun Kuş olması gerekmez. Örneğin Flier<Pterodactyl>
, veya Flier<Squirrel>
bu bireysel türlerin anlambilimlerini değiştirmeden.
Anlambilimi, bir kaptaki, tür hiyerarşileri yerine, birleştirilebilir işlevlere göre sınıflandırdığımızda, "tür bir tür, belirli tür bir hiyerarşiye uymayan" sınıflarla ilgili eski sorunları çözer. Aynı zamanda kolayca ve açıkça gibi bir sınıf için birden semantiğini verir Flier<Duck>
hem de Swimmer<Duck>
. Görünüşe göre davranışı sınıf hiyerarşileri ile sınıflandırarak bir empedans uyumsuzluğu ile mücadele ediyoruz. Monadlar zarif bir şekilde idare eder.
Öyleyse sorum şu: Aynı şekilde miras üzerine kompozisyonu tercih etmeye geldiğimiz gibi, miras üzerine monadları da tercih etmek mantıklı mı?
(BTW Bunun burada mı yoksa Comp Sci'de mi olduğundan emin değildim, ancak bu daha pratik bir modelleme problemi gibi görünüyor. Ama belki orada daha iyi.)