延续monad如何真正起作用

Max*_*zin 5 f# functional-programming

我理解Reader或者Maybe或State monad是如何工作的,但是对Continuations monad来说是困难的.像下面这样的例子,吹我的脑袋

type ContinuationMonad() =
   member this.Bind (m, f) = fun c -> m (fun a -> f a c)
   member this.Return x = fun k -> k x
Run Code Online (Sandbox Code Playgroud)

我认为我的问题是我无法获得Continuation的monadic类型(如Cont <'T>)以及我如何解开它并回绕.任何有用的示例或链接都非常感谢.

Tom*_*cek 12

我不会重复其他地方所说的内容 - 评论中提到的帖子提供了有关延续monad的大量细节.但有一点可能有用,就是使用明确的定义重写代码片段Cont<'T>:

type Cont<'T> = 
  Cont of (('T -> unit) -> unit)
Run Code Online (Sandbox Code Playgroud)

该类型Cont<'T>表示计算.您可以通过为其提供一个获取结果并对其执行某些操作(例如,打印它)的函数来启动'T -> unit.当你启动它时,它会返回unit并且它(在某个时刻)会产生一个值'T并调用你提供的延续.

使用此更明确的定义,构建器可以定义为:

type ContinuationMonad() =
   member this.Bind (ma, f) = 
      Cont(fun k -> 
        let (Cont ca) = ma
        ca (fun a -> 
            let (Cont cb) = f a
            cb k))

   member this.Return x = 
      Cont(fun k -> k x)
Run Code Online (Sandbox Code Playgroud)
  • Return成员创建一个计算,当给定延续时k,立即使用x我们返回的值调用此延续.

  • Bind成员返回一个新的计算,当给定一个延续时k,它开始由指定的计算m; 当此计算产生的值a,它会调用该函数f调用返回的计算f与原来的延续k(这是"最后"的延续应该最终将与最终结果的称呼).