2012-04-01 10 views
5

Actualmente estoy jugando con conceptos básicos de Haskell y tropezamos con el siguiente "caso de uso":utilizar una función de A → B como "monádicos" Función 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) 

Así que estoy básicamente de mezcla y monádico funciones puras aquí y las componen en una función monádica. Esto funciona, pero el return . (*10) me parece una cosa comúnmente necesaria, así que estoy tentado de definir una forma abreviada para él, algo así como monadify = (return.).

Antes de hacer eso, me gustaría preguntar si ya hay ayudantes para manejar ese tipo de situación. Por supuesto, también podría estar confundido sobre todo el asunto y hay razones por las que esto no debería hacerse. Si es así, por favor dígame.

+0

También tenga en cuenta que 'mu >> = return. f === liftM f mu === fmap f mu' (este último requiere una instancia 'Functor', pero todas las' Monad 'decentes tienen una). Como lo ilustra la respuesta de Daniel Wagner, 'regresar. f> => foo === foo. f'. En la otra posición de argumento de '(> =>)' no es tan agradable, 'foo> => return. f === fmap f. foo'. –

+0

@Daniel: ¡Bien, gracias por la información! –

Respuesta

7

No hay ninguna razón para no hacerlo. Sin embargo, rara vez es necesario. Por ejemplo, su caso de uso puede reescribirse como

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

Me sorprende que esto no se me haya ocurrido, en realidad es bastante obvio :) ¡Creo que esto responde la pregunta perfectamente bien, gracias! –

Cuestiones relacionadas