Bry*_*dds 4 monads f# lazy-evaluation
我一直在阅读Chris Okasaki的Purely Functional Data Structures,我想知道是否有一种很好的方法可以在一个monad中使用F#构建惰性算法,从而实现延迟计算(一个懒惰的monad).Chris在SML中使用了自定义扩展来实现暂停/强制语法,但我想我们可以在F#中使用一个简单的monad.在F#中手动使用懒惰和力量似乎相当混乱.
我在Scheme中找到了这个实现,但我不知道它会有多适用.
从我粗略的知识和研究来看,在合理的限制范围内似乎既可行又可取.
请告诉我 :)
要移植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)