Haskell - 如何使用< - 在where子句中

时间:2014-11-16 21:15:46

标签: haskell

我有以下代码:

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)

我该怎么做?

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