【问题标题】:Is GHCI monadic bind strict?GHCI monadic 绑定是否严格?
【发布时间】:2018-07-05 09:28:34
【问题描述】:

GHC 手册说明了 GHCI 中的一元绑定:

这两种绑定的另一个重要区别是 monadic 绑定 (p

(来自here

但我可以在 GHCI 中做到这一点:

λ: x <- return $ error ":("
λ: :sprint x
x = _

这似乎表明一元绑定并不严格。我错过了什么?

【问题讨论】:

  • x &lt;- error ":("x &lt;- return $ error ":(" 是不同的表达方式
  • 我本来打算建议尝试let e = return $ error ":("; p &lt;- e; :sprint e,但事实证明,即使评估了IO 动作也会得到sprinted 为_。无赖!但是请尝试p &lt;- Debug.Trace.trace "yep, got evaluated" $ return $ error ":(" 以证明该操作(如果不是其返回值)确实按承诺进行了评估。

标签: haskell ghci


【解决方案1】:

请记住,严格的函数意味着f ⊥ = ⊥。考虑:

ghci> x <- return undefined
-- no error

这意味着return undefined &gt;&gt;= \x -&gt; ... 不是⊥,但这并没有真正说明&gt;&gt;= 的严格性,因为return。但是:

ghci> y <- undefined
*** Exception: Prelude.undefined

是手册所指的情况,它表明bind在左参数中是严格的,因为undefined &gt;&gt;= (\y -&gt; ...)是⊥。最后,

ghci> :set -XBangPatterns
ghci> !z <- return undefined
*** Exception: Prelude.undefined

这一行显示了如果我们给它一个严格的函数作为参数会发生什么,所以我们知道return undefined &gt;&gt;= f 是⊥ 如果f 是严格的。这实际上遵循单子定律return x &gt;&gt;= f = f x,所以return ⊥ &gt;&gt;= f = f ⊥ = ⊥

【讨论】:

    【解决方案2】:

    在 Haskell 中,我们将 values 的评估与 computations 的执行分开。 return (error "") 是成功返回未定义值的计算,绑定时不会评估该值。 error "" :: IO a 是一个未定义的计算,会立即失败。

    【讨论】:

      【解决方案3】:

      我相信这是在谈论绑定,即模式匹配过程。

      let p = e in e'
      

      等价于

      case e of ~p -> e'
      

      模式p 已更改为惰性绑定~p。本质上,let 在模式前面添加了一个隐含的~。 例如,

      let [x] = [] in "hello"
      

      评估为"hello",没有运行时错误。

      do 表示法中,一个绑定

      do p <- e ; e'
      

      变成类似的东西

      e >>= (\w -> case w of
         p -> e'
         _ -> fail "some message")
      

      其中w 是一个新变量。请注意,p 在此处不会得到 ~,否则它将始终匹配并且 _ -&gt; fail ... 大小写将无法访问。

      这是需要写例如

      filterRight :: [Either a b] -> [a]
      filterRight xs = do
         Right x <- xs
         return x
      

      (这是一个变相的列表理解)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        • 1970-01-01
        • 2014-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多