2012-04-01 8 views
5

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.

+0

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'. –

+0

@Daniel: Bello, grazie per l'informazione! –

risposta

7

Non c'è nessun motivo per non farlo. Tuttavia, è raramente necessario. Ad esempio, il caso d'uso può essere riscritta come

composed = divideTenBy . (*10) <=< divideTenBy . (-)5 
+0

Sono sorpreso questo non si è verificato a me, in realtà è abbastanza ovvio :) Credo che questo risponde alla domanda perfettamente bene, grazie! –