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
(这是"最后"的延续应该最终将与最终结果的称呼).