使用函数a→b作为“monadic”函数a→m b

时间:2012-04-01 03:08:02

标签: haskell monads function-composition pointfree

我目前正在玩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)

所以我基本上将monadic和pure函数混合在一起,并将它们组合成一个monadic函数。这很有效,但return . (*10)在我看来似乎是一个常用的东西,所以我很想为它定义一个简写,比如monadify = (return.)

在我这样做之前,我想问一下是否有帮助者来处理这种情况。当然,我也可能对整个事情感到困惑,并且有理由不应该这样做。如果是的话,请告诉我。

1 个答案:

答案 0 :(得分:7)

没有理由不去做。但是,这很少是必要的。例如,您的用例可以重写为

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