gpt4 book ai didi

f# - 我的记录器计算表达式有什么问题?

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

在我尝试实现的计算表达式下方。该值被包装在一个元组中,其中元组的第二项是一个字符串列表,表示沿途的日志条目。

type LoggerBuilder() = 
member this.Bind(vl : 'a * string list, f) =
let value = vl |> fst
let logs = vl |> snd

let appendLogs logs tpl =
let value = vl |> fst
let log = vl |> snd
(value, logs |> List.append log)

(f value) |> appendLogs logs

member this.Return(x) =
(x, [])

但是,当我运行以下命令时,我没有得到预期的结果。我想知道我错过了哪里。

let log = new LoggerBuilder()

let a = log {
let! a = (1, ["assign 1"])
let! b = (2, ["assign 2"])
return a + b
}

// Result:
val a : int * string list = (1, ["assign 1"; "assign 1"])

// Expected:
val a : int * string list = (3, ["assign 1"; "assign 2"])

更新

为避免此错误,请传递 --warnon:1182fsifsc 的命令提示符。这将对未使用的“变量”发出警告。

最佳答案

问题在于appendLogs函数的实现。在那里,您不使用 tpl 参数,而是使用外部范围的 vl 代替,它仅包含当前计算部分的值和日志。你还需要翻转List.append的参数,否则日志会倒退。

通过这两个修复,您的函数将如下所示:

let appendLogs logs tpl =
let value = tpl |> fst
let log = tpl |> snd
(value, log |> List.append logs)

这样你应该会得到预期的结果。

我还想补充一点,通过在第一个方法参数和稍后的 let 绑定(bind)中使用解构,您的 Bind 函数可以更简单地实现:

member this.Bind((x, log) : 'a * string list, f) = 
let y, nextLog = f x
y, List.append log nextLog

关于f# - 我的记录器计算表达式有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22450155/

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