gpt4 book ai didi

haskell - ContT Monad : Putting the pieces together

转载 作者:行者123 更新时间:2023-12-04 04:25:08 24 4
gpt4 key购买 nike

序言

我试图围绕如何实际使用 ContTcallCC 来做一些有用的事情。我在跟踪代码周围的信息和控制流时遇到了麻烦。 (但是,这不是延续的意义吗?)

有很多不同的方法可以使用这个 monad 和一小部分不太直接的组合器来移动片段。我承认我仍然对我对 ContT 工作原理的理解感到不舒服,但我会指出我到目前为止所读到的内容:

  • Haskell/Continuation passing style
  • How and why does the Haskell Cont monad work?
  • Understanding Haskell callCC examples
  • Goto in Haskell: Can anyone explain this seemingly insane effect of continuation monad usage?
  • How to interpret callCC in Haskell?
  • Parsec Generally(让我开始走这条路的文章)

  • 我想做的是发布一个伪代码示例,然后问一些关于它的问题。这代表了使用 ContT 的代码的典型外观

    伪代码
    type MyMonad r = ContT r (State SomeState)

    main = do
    runState s_init $ runContT block print

    block :: MyMonad r a0
    block = do
    before_callcc
    output <- callCC $ \k -> do
    rval <- inner_block
    return rval
    after_callcc

    问题
  • 是什么决定了 output 的值和类型?
  • bk 类型中是什么意思?
  • 赋予 k 的值到哪里去了?
  • inner_block什么时候运行?它看到的是什么版本的状态?
  • rval 去哪里,它的类型是什么?
  • krval 是什么关系?
  • 当我在 k 中应用 inner_block 时会发生什么,b) 在 after_callcc 中,c) 在 block 之外?
  • 以上各版本中的状态是什么?
  • 我需要做什么才能从 k 中取出 block
  • 可以把k放入状态吗?


  • 颜色编码以便于阅读

    Color Coded example

    最佳答案

    1. What determines the value and type of output?


    它将与 rval 的类型相同。 .该值也将相同,除非 inner_block使用 k someValue逃离街区的其余部分。在这种情况下, output将是 someValue .

    1. What does the b mean in the type of k?


    粗略地说, b可以理解为“任何东西”。也就是说,如果 inner_block
    ...
    v <- k someValue
    use v

    然后 v :: b .但是, k someValue将永远不会运行 block 的其余部分,因为它将退出 callCC立即地。因此, v 没有具体值(value)。将永远返回。正因为如此 v可以有任何类型: use 无关紧要需要 StringInt - 无论如何它都没有被执行。

    1. Where does the value given to k go?


    只要内部 block 运行 k someValue该值由 callCC 返回如 output ,并跳过该 block 的其余部分。

    1. When is inner_block run? What version of the state does it see?


    它运行为 callCC被调用,并看到与我们当时相同的状态。

    1. Where does rval go and what its type?


    进入 output .同类型。

    1. What is the relationship between k and rval?

    rvalk 的参数类型相同.

    1. What happens when I apply k a) in inner_block, b) in after_callcc, c) outside of block?


    a) 见上文。
    b) k超出 after_callcc 的范围.
    c) 也超出范围。

    1. What is the version of the state in each of the above?


    状态是“当前”状态。 (我不确定你到底在这里要求什么)

    1. What do I need to do to get k out of block?


    我猜这里需要一个递归类型。这是一个尝试:
    import Control.Monad.Cont
    import Control.Monad.State
    import Control.Monad.Trans

    type SomeState = String
    type MyMonad r = ContT r (State SomeState)

    newtype K a b r = K ((K a b r, a) -> MyMonad r b)

    main = do
    print $ flip runState "init" $ runContT block return

    block :: MyMonad r Int
    block = do
    lift $ modify (++ ":start")
    (K myK, output) <- callCC $ \k -> do
    s <- lift $ get
    lift $ modify (++ ":inner(" ++ show (length s) ++")")
    return (K k, 10)
    lift $ modify (++ ":output=" ++ show output)
    s <- lift $ get
    when (length s <50) $ myK (K myK, output+1)
    return 5

    这打印
    (5,"init:start:inner(10):output=10:output=11:output=12")

    1. Can I put k into the state?


    我相信你也需要一个递归类型。

    关于haskell - ContT Monad : Putting the pieces together,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32419145/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com