gpt4 book ai didi

f# - 在计算表达式中省略 'do!'

转载 作者:行者123 更新时间:2023-12-03 23:48:33 25 4
gpt4 key购买 nike

是否可以将一个计算表达式构建器放在一起,它可以在不放置 do! 的情况下对两个或多个表达式进行排序?在每个人面前?

如果我读过 relevant section of the manual正确,这应该可以通过构建器的 Combine 来实现方法。然而,我的 Combine似乎没有使用方法;相反,我收到一个编译器警告,提示我使用 ignore丢弃结果。

例如,给定一个 F# State monad ,我希望能够做到这一点:

let hello who = State (fun lines -> lines @ [sprintf "hello %s" who])
let m = state {
hello "world"
hello "F#"
}
let l = Execute m []
// l should now contain ["hello world"; "hello F#"]

最佳答案

除了 Dario 所写的内容之外,您无法重新定义通常的排序以表现为 monadic do! (即使您决定在计算中不支持非 monadic 操作)。问题是翻译器不会以任何特殊方式处理通常的排序,因此没有可以使用的拦截点。您的示例将被翻译如下:

let m = state.Delay(fun () ->
hello "world"
hello "F#"
state.Zero())

调用 hello没有包含在任何可以重新定义的成员调用中。

早期版本 F# 序列的一部分曾经被转换为对 Let 的调用像这样的成员:
let m = state.Delay(fun () ->
state.Let(hello "world", fun _ ->
state.Let(hello "F#", fun _ ->
state.Zero())))

所以可以做你想做的事,但不能在当前版本中完成(我相信一个原因是这增加了太多的包装而损害了性能)。

关于f# - 在计算表达式中省略 'do!',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587478/

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