gpt4 book ai didi

f# - 如何显式引用运算符

转载 作者:行者123 更新时间:2023-12-02 02:45:51 25 4
gpt4 key购买 nike

我正在尝试使用 Microsoft.ML.Probabilistic,示例是用 C# 编写的。

例如

static void Main(string[] args)
{
var firstHeads = Variable.Bernoulli(0.5);
var secondHeads = Variable.Bernoulli(0.5);
var bothHeads = firstHeads & secondHeads;
}

现在发生了一些神奇的事情,& 运算符由 C# 编译器解析为

Variable<bool>.operator &(Variable<bool> a, Variable<bool> b)

(实际上,尽管我已经使用 C# 15 年多了,但我实际上并不知道如何显式引用这个运算符,我只是让编译器完成艰苦的工作......但这是一个旁白)

我想在 F# 中执行此操作,所以我这样写

let main argv =
let firstCoinHeads = Variable.Bernoulli 0.5
let secondCoinHeads = Variable.Bernoulli 0.5
let bothHeads = firstCoinHeads & secondCoinHeads
0

但这无法编译,因为对于子表达式“firstCoinHeads”和“secondCoinHeads”,F# 编译器“此表达式预计为 bool”。

这有点令人恼火......那么我如何明确地让 F# 使用正确的运算符?

最佳答案

在 .NET(以及更大程度上在 F# 中)运算符被编译为名为 op_Xyz 的方法,其中 Xyz 描述运算符本身(对于 .NET overloadable operators )或运算符中包含的字符(对于更丰富的 F# 运算符)。

具体来说,运算符 & 被编译为 op_BitwiseAnd,这就是您访问它的方式:

let bothHeads = Variable.op_BitwiseAnd(firstCoinHeads, secondCoinHeads)

您遇到的最初问题来自这样一个事实:在 F# 中,运算符 & 是“特殊的”(人们认为是为了与 Ocaml 向后兼容)。它被编译器特殊对待,强制参数为 bool 并在您尝试重新定义它时发出警告。是的,这有点烦人,但我们就在这里。

但是您可以为自己定义一个不同的运算符作为 Variable 类型的扩展:

type Variable<'t> with
static member (&.)(a, b) = Variable<bool>.op_BitwiseAnd(a, b)

然后像这样使用它:

let bothHeads = firstCoinHeads &. secondCoinHeads

关于f# - 如何显式引用运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62818742/

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