guard :: (MonadPlus m) => Bool -> m()
guard True = return()
guard False = mzero
Prelude Control.Monad> :t mzero
mzero :: (MonadPlus m) => m a
guard
'ün Yanlış dalında, mzero
'ün türü m a
'dir, ancak guard
'nın dönüş tipi m()
olarak belirtilmiştir. Bu yüzden derleyici neden bu konuda şikayette bulunmayacağımı anlamıyorum.'m a' vs 'm()' bekçi
Eğer mzero
Maybe Int
olarak yazılan bir değeri döndürürse, tabiki Maybe()
'den farklıdır, değil mi?
'mzero', 'Belki Int' gibi bir şey döndürebilir, değil mi? Sanırım 'Belki()' – aXqd
@ aXqd: Belki monad için, 'a' için tercih edilen bir türü olmayan mzero = Hiçbir şey. Eğer gerçekten 'Int' diye bir şey yapmıyorsanız, belki de() 'den farklıdır. Bununla birlikte, tür belki 'olası' için bir 'a', 'ınl' değil,' ınİ', yani belki de() 'geçerlidir. – kennytm
@KennyTM Cevabınız için teşekkür ederiz. Evet, kötü bir örnek kullanabilirim. Ancak, özel bir yazı yazmam gerekirse - 'MyType', ve daha sonra bunu 'Monad' ve 'MonadPlus' örneğidir. O zaman 'mzero' iadesi 'MyType Int' yapabilirim. Aslında, eğer 'mzero' tarafından döndürülen şeyin 'm()' olmadığı bir şans varsa, derleyici bunun hakkında şikayette bulunmalı. Çünkü 'mzero' tipi ve 'bekçi' tipi dönüş tipi birbiriyle uyuşmuyor. Bu sonuca yanlış olduğumu biliyorum. Problemin nerede olduğundan emin değilim. : P – aXqd