我正在尝试使用 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/