【发布时间】:2013-06-18 18:57:56
【问题描述】:
我想编写一个函数,它使用getLine 读取一些数据并返回,即一个元组 (Integer, Integer) 但使用 do-notation。像这样的东西(当然它不起作用):
fun :: (Integer, Integer)
fun = do
a <- read (getLine::Integer)
b <- read (getLine::Integer)
return (a, b)
我必须为此编写自己的 monad 吗?有什么办法可以不写一个新的 monad 吗?
编辑
所以我可以编写使用fun 的main 函数,我认为这是唯一的解决方案:
main :: IO ()
main = do
tuple <- fun
putStrLn (show tuple)
fun :: IO (Integer, Integer)
fun = do
a1 <- getLine
b1 <- getLine
let a = read (a1)
b = read (b1)
return (a, b)
以上代码有效。
【问题讨论】:
-
那不可能,fun的类型必须是IO(Int, Int),不能离开IO Monad。
-
请注意,
return的含义与您在程序语言中可能习惯的完全不同。你所拥有的不是函数。在函数中,“返回”的结果就是=右侧的表达式。相比之下,return总是将一个值注入某个 monad(在 GHCi 中输入:t return时可以很清楚地看到它),在这种情况下是IOmonad。
标签: haskell monads do-notation