В настоящее время я играю с основами Haskell и наткнулся на следующий «прецедент»:
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)
Итак, я в основном смешиваю монадические и чистые функции и объединяю их в монадическую функцию. Это работает, но мне кажется, что return . (*10)
обычно нужная вещь, поэтому у меня возникает соблазн определить для нее сокращение, что-то вроде monadify = (return.)
.
Однако прежде чем я это сделаю, я хотел бы спросить, есть ли уже помощники для решения подобных ситуаций. Конечно, я тоже мог запутаться во всем этом, и есть причины, по которым этого не следует делать. Если это так, пожалуйста, скажите мне.
mu >>= return . f === liftM f mu === fmap f mu
(для последнего требуется экземплярFunctor
, но он есть у всех приличныхMonad
). Как показывает ответ Даниэля Вагнера,return . f >=> foo === foo . f
. В позиции другого аргумента(>=>)
все не так хорошо,foo >=> return . f === fmap f . foo
. - person Daniel Fischer   schedule 14.09.2012