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

标签 f#

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

相关文章:

f# - 如何在 F# 中定义执行顺序?

f# - F# 元组的扩展方法

visual-studio - F# Visual Power Tools 不起作用

arrays - 如果Array.append没有部分应用可变参数,则可以删除lambda

f# - XSD.EXE 从 XSD 生成 F# 类

F# Observable - 将事件流转换为列表

F-Sharp 中的文件替换

f# - 是否可以计算 f# 中负数的连分数?

c# - F# 区分联合与 C# 类层次结构

f# - Elmish.WPF 中子模型到父模型/主模型的消息传递是如何完成的?