Attualmente sto giocando intorno con basi Haskell e siamo capitati il seguente "caso d'uso":utilizzare una funzione di un → b come "monadici" funzione A → mb
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)
Quindi sono fondamentalmente miscelazione monadica e funzioni pure qui e le compongono in una funzione monadica. Questo funziona, ma il return . (*10)
mi sembra una cosa comunemente necessarie, quindi sono tentato di definire una scorciatoia per esso, qualcosa come monadify = (return.)
.
Prima di fare questo, però, mi piacerebbe chiedere se ci sono già aiutanti per affrontare questo tipo di situazione. Naturalmente potrei anche essere confuso riguardo al tutto e ci sono dei motivi per cui questo non dovrebbe essere fatto. Se è così, dimmelo per favore.
Si noti inoltre che 'mu >> = ritorno. f === liftM f mu === fmap f mu' (quest'ultimo richiede un'istanza 'Functor', ma tutti i' Monad'decenti ne hanno uno). Come illustra la risposta di Daniel Wagner, 'return. f> => foo === foo. f'. Nell'altro argomento la posizione di '(> =>)' non è così bella, 'foo> => return. f === fmap f. foo'. –
@Daniel: Bello, grazie per l'informazione! –