Hesaplama ifadesi monad ile aynı mıdır?


22

Hala işlevsel programlama öğreniyorum (f # ile) ve yakın zamanda hesaplama ifadeleri hakkında okumaya başladım. Konsepti hala tam olarak anlamıyorum ve monadlarla ilgili tüm makaleleri okurken (birçoğu Haskell'a dayanıyor), beni ifade ifadeleri ve monadlar arasındaki ilişkiden emin olmadan tutan bir şey.

Bunları yazdıktan sonra, işte sorum (iki soru aslında):

Her F # hesaplama ifadesi bir monad mıdır? Her monad F # hesaplama ifadesiyle ifade edilebilir mi?

Tomas Petricek'in bu gönderisini okudum ve iyi anlarsam, hesaplama ifadelerinin monadlardan daha fazla olduğunu belirtir, ancak bunu doğru yorumlayıp yorumlamadığımdan emin değilim.


@Raphael, lang etiketini kaldırma nedeninin ne olduğunu sorabilir miyim?
Grzegorz Sławecki,

2
Kavramları önemsememizden dolayı, burada çoğu şeyi dilin agnostik tutmaya çalışıyoruz. Buna F # çıkarmadan soruya ne yaptığını bilmiyorum ( ben sadece F # etiketi kaldırmak yüzden 's F # sonra soru burada offtopic önemlidir eğer düşünüyorum, ama bir sınır durum). Temel kural: F # bir CS kavramı değildir, bu yüzden bir etikete ihtiyaç duymaz. (Evet, diğer PL etiketlerinin farkındayım ve ben de onları sevmiyorum. Bazı sorular için, topluluk bu etiketleri garanti etmelerine karar verdi.)
Raphael

1
@Raphael Sorunun gerçekten bir sınır çizgisi olayı olduğuna inanıyorum. Birisi onu buraya taşımaya karar verdi, ancak burada da biraz konu dışı görünüyor. Sorunun kendisi bir tür bilgisayardır, ancak aynı zamanda hem cevaplar hem de soru özellikle f # ile ilgilidir. Anlıyorum senin kural kural, açıklama için teşekkür ederiz.
Grzegorz Sławecki,

Yanıtlar:


22

Öncelikle, hesaplama ifadeleri bir dil özelliğidir, monadlar matematiksel soyutlamalar olsa da, bu açıdan, tamamen farklı şeylerdir .

Ancak bu çok yararlı bir cevap olmazdı :-). Hesaplama ifadeleri, monadik bir yapıya sahip olan hesaplamalarla (veya veri türleriyle) programlama için kullanılabilecek bir sözdizimi sağlayan bir dil özelliğidir, ancak diğer yapılarla da kullanılabilirler. F # hesaplama ifadesi hayvanat bahçesi kağıtmı daha fazla ayrıntı için okuyabilirsiniz , ancak hesaplama ifadeleri aşağıdakilerle kullanılabilir:

  • Monads, aynı zamanda katkı monads (neyi Haskellers çağrı MonadPlusveya MonadOr)
  • Birleşik hesaplamalar (Haskellers'ın monad transformatörler dediği şey)
  • Monadik olan ancak istisna işleme gibi diğer F # yapılarını destekleyen hesaplamalar
  • Monoitler (ve monadik bağlanma olmadan birkaç varyasyon)
  • Uygulamalı fonktörler (bu sadece bir araştırma uzantısında uygulandığı halde)

Dolayısıyla, hesaplama ifadeleri kesinlikle monadlarla yakından ilişkilidir, ancak bunlarla yakından ilişkili değildir. Bu, örneğin, Monklerle doçok daha yakından bağlantılı olan Haskell'in gösterimi ile zıttır (her ne kadar kesinlikle matematiksel olarak monad olmayan hesaplamalar ile kullanılabilse de).


3
Monad transformatörleri, bir monad'ı başka bir monad'a dönüştürmenin genel bir yoludur - F # hesaplama ifadeleri, dönüşümün kendisinden ziyade, bu dönüşümün / sonucunun / sonucunun doğrudan uygulanmasını gerçekten destekler.
GS - Monica'dan

1
@ GaneshSittampalam - Evet, haklısın. Sadeleştirme girişimi bu kadar faydalı değildi :-). Hesaplama ifadeleri, bir monad transformatörü uygulamasının sonucu olan bir hesaplama ile çalışmak için bir sözdizimi verebilir (altta yatan monad ve oluşan monad için potansiyel olarak farklı bir sözdizimi ile)
Tomas Petricek

5

Monadları ifade etmek için hesaplama ifadelerini kullanabilirsiniz. Burada bir örnek var . Ayrıca, belirttiğiniz gibi, hesaplama ifadelerini monadlardan çok daha fazlası için kullanabilirsiniz. Burada nasıl farklı olduklarına dair geniş bir açıklama var . Buradaki farkı düzgün bir şekilde açıklamak için alan yok, ancak hesaplama ifadeleri normal F # sözdizimini tekrar kullanmaları ve ek soyutlamalar ekleyebilmeleri için monadlardan farklı. Bir sınırlama, deyimsel olmayan (ve zor) hesaplama türü üzerinde polimorfik olan bir hesaplama ifadesi yazmaktır.


1
Lütfen cevabınızı, en azından link verdiğiniz sayfalardaki materyalleri özetleyerek daha bağımsız hale getirin. İki bağlantı çalışmayı keserse mevcut cevabınız tamamen anlamsız olacaktır.
David Richerby

2
Neden bahsettiğinden emin değilim. Soruları açıkça cevapladım ve daha sonra soruya ilgiliyse daha fazla bilgi için link verdim Soruyu cevaplamak için bağlantılar gerekli değildir.
N_A

1
İki bağlantının çalışmayı durdurabileceğini bile hayal bile edemiyorum :-)
Tomas Petricek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.