【发布时间】:2020-07-24 00:13:03
【问题描述】:
我正在努力掌握 Haskell 中的 do notation。
我可以将它与 Maybe 一起使用,然后打印结果。像这样:
maybeAdd :: Maybe Integer
maybeAdd = do one <- maybe1
two <- maybe2
three <- maybe3
return (one + two + three)
main :: IO ()
main = putStr (show $ fromMaybe 0 maybeAdd)
但我没有使用单独的函数,而是尝试在 main 函数中使用带有 Maybe 的 do 表示法。但我没有任何运气。我尝试的各种尝试包括:
main :: IO ()
main = do one <- maybe1
two <- maybe2
three <- maybe3
putStr (show $ fromMaybe 0 $ return (one + two + three))
main :: IO ()
main = do one <- maybe1
two <- maybe2
three <- maybe3
putStr (show $ fromMaybe 0 $ Just (one + two + three))
main :: IO ()
main = do one <- maybe1
two <- maybe2
three <- maybe3
putStr (show $ (one + two + three))
所有这些都会导致各种类型的编译错误,遗憾的是我未能破译以找到正确的方法。
我如何实现上述目标?也许也可以解释为什么我尝试的方法是错误的?
【问题讨论】:
-
出于这个原因,有 Monad Transformers 抽象。对于您的情况,即
MaybeT IO ()。然后你将有一个单独的 do 块。 -
感谢~Redu 的参与。我猜 MaybeT 住在某个地方的另一个模块中。那会在哪里?它的使用情况如何?现在 main 的类型是 MaybeT IO () 吗?我不认为这是正确的
-
我试图通过以下回答来解决您的问题。
标签: haskell monads do-notation