我认为它是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
或者我只是做了可怕的错误?
答案 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