【问题标题】:Haskell - How to use <- in where clausesHaskell - 如何在 where 子句中使用 <-
【发布时间】:2014-11-16 21:15:46
【问题描述】:

我有以下代码:

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

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)

我该怎么做?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    这是不允许的。 where 子句不会强加评估顺序,这对于大多数 Monad 是必需的,例如 IO。如果这是可能的,那么bar 6 相对于两个prints 何时执行?是在最开始还是在它们之间?

    【讨论】:

    • 这是有道理的。谢谢!
    【解决方案2】:

    我该怎么做?

    这没有意义。对不起。

    do 块中的以下内容:

    a <- b
    c
    

    相当于:

    b >>= (\a -> c)
    

    所以单独的a &lt;- b 相当于:b &gt;&gt;= (\a -&gt;) 这是一个语法错误。

    无论如何,您无需将x 存储在where 子句中。在你的程序中:

    foo :: Int -> IO ()
    foo n = do
        x <- bar 6
        ...
    

    x &lt;- bar 6 之后,您可以在do 块内的任何地方重复使用x

    【讨论】:

      猜你喜欢
      • 2016-12-31
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2020-11-30
      相关资源
      最近更新 更多