我有以下代码:
foo :: Int -> IO ()
foo n = do
x <- bar 6
print "foo running..."
print x
bar :: Int -> IO Int
bar n = do
print "bar running..."
return (n*2)
Run Code Online (Sandbox Code Playgroud)
现在我想将"x < - bar 6"部分放在where子句中,如下所示:
foo :: Int -> IO ()
foo n = do
print "foo running..."
print x
where
x <- bar 6
bar :: Int -> IO Int
bar n = do
print "bar running..."
return (n*2)
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
Dav*_*vid 15
这是不允许的.一个where
条款没有强制执行评估订单,这对于大多数Monad来说是必需的,例如IO
.如果这是可能的,何时会bar 6
相对于两个print
s 执行?它会在一开始还是在它们之间?
我该怎么做呢?
这没有意义.对不起.
以下是一个do
块:
a <- b
c
Run Code Online (Sandbox Code Playgroud)
相当于:
b >>= (\a -> c)
Run Code Online (Sandbox Code Playgroud)
如此a <- b
孤独,将等同于:b >>= (\a ->)
这是一个语法错误.
无论如何,您无需存储x
在where
子句中.在你的程序中:
foo :: Int -> IO ()
foo n = do
x <- bar 6
...
Run Code Online (Sandbox Code Playgroud)
之后x <- bar 6
,您可以x
在do
块内的任何地方重复使用.