有没有人在F#中构建一个懒惰的Monad?

Bry*_*dds 4 monads f# lazy-evaluation

我一直在阅读Chris Okasaki的Purely Functional Data Structures,我想知道是否有一种很好的方法可以在一个monad中使用F#构建惰性算法,从而实现延迟计算(一个懒惰的monad).Chris在SML中使用了自定义扩展来实现暂停/强制语法,但我想我们可以在F#中使用一个简单的monad.在F#中手动使用懒惰和力量似乎相当混乱.

我在Scheme中找到了这个实现,但我不知道它会有多适用.

从我粗略的知识和研究来看,在合理的限制范围内似乎既可行又可取.

请告诉我 :)

t0y*_*yv0 7

要移植Okasaki代码,为什么不使用F#lazy关键字和一些帮助语法来表示强制,例如:

let (!) (x: Lazy<'T>) : 'T = x.Value
Run Code Online (Sandbox Code Playgroud)

由于F#类型系统无法正确表达monad,我假设您建议为延迟计算定义计算表达式.我猜一个人可以做到这一点,但这对那有什么帮助呢?

type LazyBuilder =
    | Lazy

    member this.Return(x: 'T) : Lazy<'T> =
        Lazy.CreateFromValue(x)

    member this.Bind(x: Lazy<'T1>, f: 'T1 -> Lazy<'T2>) : Lazy<'T2> =
        lazy (f x.Value).Value

let test () =
    let v =
        Lazy {
            let! x = lazy 1
            let! y = lazy 2
            return x + y
        }
    v.Value


let (!) (x: Lazy<'T>) : 'T = x.Value

let test2 () =
    let v =
        lazy
            let x = lazy 1
            let y = lazy 2
            !x + !y
    !v
Run Code Online (Sandbox Code Playgroud)