gpt4 book ai didi

f# - 有没有人用 F# 构建过 Lazy Monad?

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

我一直在阅读 Chris Okasaki 的 Purely Functional Data Structures ,并且想知道是否有一种很好的方法可以在 monad 中使用 F# 构建惰性算法,从而实现惰性计算(惰性 monad)。 Chris 在 SML 中使用了一个用于暂停/强制语法的自定义扩展,但我想我们可以改为在 F# 中使用一个简单的 monad。在 F# 中手动使用 lazy 和 force 似乎很困惑。

我找到了 this在 Scheme 中实现,但我不知道它有多适用。

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

请告诉我 :)

最佳答案

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

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

由于 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

关于f# - 有没有人用 F# 构建过 Lazy Monad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8773006/

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