无法弄清楚我正在寻找的monad功能

时间:2016-06-23 14:55:14

标签: haskell monads

我认为它是liftM,但类型签名似乎不正确。我希望能有这样的功能:

 someFunc :: Monad m => (a -> b) -> a -> m b
 someFunc f = return . f

我知道我可以用上面的代码来定义它,但是我的直觉说这已经存在了,我只是因为某种原因而没有看到它。

例如:

main = do
    n_tmp <- getLine
    let n = read n_tmp :: Int

VS

main = do
    getLine >>= someFunc read :: IO Int

或者我只是做了可怕的错误?

2 个答案:

答案 0 :(得分:9)

在这种情况下我只使用fmap ....

main = do
    n <- fmap read getLine
    ....

答案 1 :(得分:4)

半开玩笑地说,您正在寻找(return.)(.)功能的简单部分应用return。对于可能分配给它的任何合理名称,几乎不需要打字:

someFunc :: Monad m => (a -> b) -> a -> m b
someFunc = (return.)
-- or someFunc = (.)return

比较

getLine >>= someFunc read :: IO Int
getLine >>= return.read :: IO Int