我所说的扩展计算表达式是指具有通过CustomOperation属性定义的自定义关键字的计算表达式。
在阅读扩展计算表达式时,我遇到了@kvb 的非常酷的 IL DSL:
let il = ILBuilder()
// will return 42 when called
// val fortyTwoFn : (unit -> int)
let fortyTwoFn =
il {
ldc_i4 6
ldc_i4_0
ldc_i4 7
add
mul
ret
}
我想知道在不使用for..in..do
构造的情况下如何组成操作。我的直觉是它从x.Zero
成员开始,但我没有找到任何参考来验证这一点。
如果上面的例子技术性太强,这里有一个类似的 DSL,其中幻灯片的组件没有列出for..in..do
:
page {
title "Happy New Year F# community"
item "May F# continue to shine as it did in 2012"
code @"…"
button (…)
} |> SlideShow.show
我有几个密切相关的问题:
- 如何定义或使用没有
For
成员的扩展计算表达式(即提供一个小的完整示例)?如果它们不再是 monad,我不会太担心,我对它们开发 DSL 很感兴趣。 - 我们可以使用
let!
和的扩展计算表达式return!
吗?如果是,有什么理由不这样做吗?我问这些问题是因为我没有遇到任何使用let!
and的例子return!
。