Haskell'de böyle döngüler büyü olmadıklarını unutmayın ... bunlar sadece kendinize yazabileceğiniz birinci sınıf şeylerdir.
Değeri için, MaybeT
'u Monad transformatörü olarak düşünmenin çok faydalı olduğunu düşünmüyorum. Bana göre MaybeT
sadece mappend
ve mempty
alternatif uygulamalarını vermek Product
, Sum
, First
, And
vb nasıl kullandıklarını gibi (>>=)
alternatif uygulaması vermek için sadece bir newtype sarıcı ... olduğunu.
Şu an için (>>=)
sizin için IO a -> (a -> IO b) -> IO b
. Ancak (>>=)
'un IO (Maybe a) -> (a -> IO (Maybe b) -> IO (Maybe b)
olması daha kullanışlı olacaktır. Bir Nothing
döndüren ilk eyleme ulaşır ulaşmaz, daha fazla "bağlamak" gerçekten imkansız. Bu tam olarak MaybeT
'un size verdiği şeydir. Ayrıca, guard :: IO a
yerine guard
, guard :: Bool -> IO (Maybe a)
"özel örneği" alabilirsiniz.
forM_ [1..100] $ \i -> runMaybeT $ do
a <- lift doSomeIO
guard (isValid1 a)
b <- lift $ doSomeOtherIO a
guard (isValid2 b)
...
ve bu kadar
MaybeT
:) Ya sihirli değildir ve iç içe geçmiş when
s kullanarak temelde aynı etkiyi elde edebilirsiniz. Bu değil gerekli, sadece çok basit ve işler yapar bulunuyor temizleyici :)
: Ørjan Johansen yararlı tavsiyeler @ kullanma
, burada bir basit örneğidir. Gördüğüm en ilginç olanı muhtemelen https://hackage.haskell.org/package/loops – dfeuerMonad transformatörlerinin asla gerekli olmaması - sadece uygun. –