我有以下代码:
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)
现在我想将“x&lt; - 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)
我该怎么做?
答案 0 :(得分:15)
这是不允许的。 where
子句不会强制执行评估订单,这对于大多数Monad来说都是必需的,例如IO
。如果这是可能的,那么bar 6
什么时候会相对于两个print
执行?它会在一开始还是在它们之间?
答案 1 :(得分:5)
我该怎么做?
没有意义。对不起。
以下内容,在do
块中:
a <- b
c
相当于:
b >>= (\a -> c)
单独a <- b
,相当于:b >>= (\a ->)
,这是一个语法错误。
无论如何,您无需将x
存储在where
条款中。在你的计划中:
foo :: Int -> IO ()
foo n = do
x <- bar 6
...
在x <- bar 6
之后,您可以在x
块中的任何位置重复使用do
。