Monad'ları öğrendim ve Control.Monad'da pek çok işlevi uygulamaya çalışıyorum. Sadece ap
'a ulaştım, ancak çalışamam. almostAp :: Monad m => m (a -> b) -> m a -> m (m b)
işlevini yaptım ve yaptığım başka bir işlevle oluşturmaya çalıştım, flatten :: Monad m => m (m b) -> m b
. Ben ap = flatten . almostAp
kullanmaya çalıştığınızda sorun (flatten .)
GHCi göre Monad m => (a -> m (m b)) -> a -> m b
tip vardır, benMonadic işlevler oluşturmaya çalışırken hata
Occurs check: cannot construct the infinite type: m ~ (->) (m a)
Expected type: m (a -> b) -> m a -> m a -> m b
Actual type: m (a -> b) -> m a -> m (m b)
In the second argument of ‘(.)’, namely ‘almostAp’
In the expression: (flatten . almostAp)`
olsun Ama, neden böyle oluyor? İşte
fonksiyon tanımları vardır (ben =<<
onları temizlemek biliyorum ve funktor kanunları):
almostAp :: Monad m => m (a -> b) -> m a -> m (m b)
almostAp = (flip (\x -> fmap ($x))) . (fmap (flip (>>=))) . (fmap (return .))
flatten :: Monad m => m (m a) -> m a
flatten = (>>= id)
Kodunuzu okumak zor bir hale getiren noktadan arınmış bir stile sahip görünüyorsunuz (ve yazmayı da çok zor biliyorum!) "Bağlama" veya "Yapma" dan korkma notasyonu. –
"Bırakın noktadan arındırılmış stil: sadece" kullan "anlamında mantıklı ve" daha iyi "yapacaksın" – Cactus