【问题标题】:Continuation Monad Working继续单子工作
【发布时间】:2014-02-17 06:27:27
【问题描述】:

我正试图围绕以下这段代码进行思考:

ex2 = do
  a <- return 1
  b <- Cont (\fred -> fred 10)
  return $ a + b

ghci > runCont ex2 show
"11"

String "11" 函数的输出是怎样的?我得到了 show 函数将 10 转换为字符串的那部分,但是由于字符串数字无法相加,a + b 是如何发生的?

【问题讨论】:

    标签: haskell monads continuations


    【解决方案1】:

    关键是ab 具有Int 类型,并且只有在ab 之后 完成Stringb 的转换相加。

    如果您需要进一步说服,问问自己是否有任何问题

    runCont ex2 id
    

    runCont ex2 (\a -> a * a)
    

    如果你需要更有说服力,请注意类型定义和 monad 实例是

    data Cont r a = Cont { runCont :: (a -> r) -> r }
    
    instance Monad (Cont r) where
      return a = Cont ($a)
    

    这样你就可以眯着眼睛说服自己,你的例子等价于

    ex = do
      a <- return 1
      b <- return 10
      return (a + b)
    

    这只是

    ex = return (1 + 10)
    

    【讨论】:

    • 包含&gt;&gt;= 的定义并解释Cont (\fred -&gt; fred 10) 如何等同于return 10 可能更具启发性。
    猜你喜欢
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多