考虑以下有效的 Haskell 代码
module Main where
main :: IO ()
main = do
let x = f
print x
f :: Maybe (Int, Int)
f =
Just 3 >>= (\a ->
Just 5 >>= (\b ->
return (a, b)))
函数f
可以用这样的 do-notation 等效地重写
f :: Maybe (Int, Int)
f = do
a <- Just 3
b <- Just 5
return (a, b)
让我烦恼的是,当我将内联的内容放入时,do 表示法不起作用f
。以下代码甚至不解析:
main :: IO ()
main = do
let x = do
a <- Just 3
b <- Just 5
return (a, b)
print x
我是否正确,let
我被迫诉诸于内心(>>=)
?
当我这样做时,以下代码也不会解析:
module Main where
main :: IO ()
main = do
let x =
Just 3 >>= (\a ->
Just 5 >>= (\b ->
return (a, b)))
print x
除了let
. 有没有优雅的使用方式bind
inside let
?