2012-04-01 12 views
5

"monadic" işlevi → mb b bir işlev a → kullanın: Ben temelde monadic karıştırma ediyorumŞu anda Haskell temelleri ile oynamak ve sonrasında "kullanım durumunda" tökezledi am

Yani
ghci> let divideTenBy x | x == 0 = Nothing | otherwise = Just (10/x) 
ghci> let composed = divideTenBy <=< return . (*10) <=< divideTenBy <=< return . (-)5 
ghci> Just 5 >>= composed 
Nothing 
ghci> Just 10 >>= composed 
Just (-0.5) 

ve Burada saf işlevler ve onları monadik bir işlev haline getirin. Bu çalışır, ama return . (*10) bana sıkça ihtiyaç duyulan bir şey gibi görünüyor, bu yüzden, monadify = (return.) gibi bir şey için bir shorthand tanımlamak için cazip.

Bunu yapmadan önce, bu tür bir durumla uğraşmak için zaten yardımcıların olup olmadığını sormak isterim. Tabii ki her şey hakkında kafam karışabilir ve bunun yapılmaması için nedenler vardır. Eğer öyleyse, lütfen söyle.

+0

Yeniden yazılabilir. f === liftM f mu === fmap f mu '(ikincisi bir 'Functor' örneğini gerektirir, ancak tüm iyi' Monad'ların bir tane vardır). Daniel Wagner'in cevabı gösterdiği gibi, geri dön. f> => foo === foo. f'. '(> =>)' Nin diğer argüman pozisyonunda, o kadar güzel değil, 'foo> => geri dön. f === fmap f. foo'. –

+0

@Daniel: Güzel, bilgi için teşekkürler! –

cevap

7

Yapmamak için hiçbir neden yok. Ancak, nadiren gerekli. Örneğin, kullanım durumunuz

+0

Bu benim için gerçekleşmedi şaşırıyorum, aslında oldukça açık :) Bu soruya mükemmel cevaplar sanırım, teşekkür ederim! –

İlgili konular