F# 如何显式引用运算符
我正在尝试使用Microsoft.ML.probability,示例是C# e、 g 现在这里有一点神奇之处,&运算符由C#编译器解析为F# 如何显式引用运算符,f#,F#,我正在尝试使用Microsoft.ML.probability,示例是C# e、 g 现在这里有一点神奇之处,&运算符由C#编译器解析为 Variable<bool>.operator &(Variable<bool> a, Variable<bool> b) 但这并没有编译,因为F#编译器“this expression应该是bool”用于子表达式“firstCoinHeads”和“secondCoinHeads” 这有点令人恼火……那么我如何明确
Variable<bool>.operator &(Variable<bool> a, Variable<bool> b)
但这并没有编译,因为F#编译器“this expression应该是bool”用于子表达式“firstCoinHeads”和“secondCoinHeads”
这有点令人恼火……那么我如何明确地让F#使用正确的运算符呢?在.NET中(在更大程度上,在F#中)运算符被编译成名为op#Xyz
的方法,其中Xyz
描述了运算符本身(for)或运算符中包含的字符(对于更丰富的F#运算符)
具体来说,操作符和被编译为op\u BitwiseAnd
,这就是您访问它的方式:
let bothHeads = Variable.op_BitwiseAnd(firstCoinHeads, secondCoinHeads)
您遇到的最初问题来自这样一个事实,即在F#中,操作符&
是“特殊的”(假设是为了与Ocaml的向后兼容性)。编译器对其进行了特殊处理,强制参数为bool
,并在尝试重新定义时发出警告。是的,这有点麻烦,但我们到了
但是您可以定义一个不同的运算符作为变量
类型的扩展:
type Variable<'t> with
static member (&.)(a, b) = Variable<bool>.op_BitwiseAnd(a, b)
@Fyodor Soikin给出的答案没有错,但建议的解决方案是不必要的。运营商似乎有点困惑:
- “按位and”实际上编译为
op\u按位and
- 在C#中,按位and是
&
- 在F#中,按位and是
&&
这是您想要的。
- 在F#中,
和
用于匹配表达式,表示“和”,并作为
运算符的一元地址此运算符没有默认映射。(如果被重写,它将成为运算放大器
)
F#中的布尔“and”是&&
您当然可以在F#中重新定义&&
。若要重新定义运算符的地址,请不要太多(您会收到警告)
但是,如果一个类型重载了一个运算符,如果使用正确的匹配语法运算符,F#将只选择该运算符。在本例中,&&&
。是的,这确实令人困惑
如果我安装了Microsoft.ML.Probabilistic
和Microsoft.ML.Probabilistic.Compilers
,我可以执行以下操作(可以使用--langversion:preview
使用nuget
语法):
#r“nuget:Microsoft.ML.cn”;;
>打开Microsoft.ML;;
[正在加载C:\Users\Me\AppData\Local\Temp\nuget\10644\Project.fsproj.fsx]
名称空间FSI_0138.Project
>#r“nuget:Microsoft.ML.probability.Compiler”;;
>打开Microsoft.ML.probability.Models;;
[正在加载C:\Users\Me\AppData\Local\Temp\nuget\10644\Project.fsproj.fsx]
名称空间FSI_0143.Project
>设firstCoinHeads=Variable.Bernoulli 0.5
设secondCoinHeads=Variable.Bernoulli 0.5;;
将会话绑定到“C:\Users\Abel\.nuget\packages\microsoft.ml.probabilistic\0.3.1912.403\lib\netstandard2.0\microsoft.ml.probabilistic.dll”。。。
val firstCoinHeads:Variable=vbool0
val secondCoinHeads:Variable=vbool1
>让两个头部=第一个头部和第二个头部;;
val bothHeads:变量=vbool2
如您所见,这里不需要创建“您自己的”特殊运算符,只需使用实际的“按位and”运算符:&&
如果您再次遇到此问题,则会出现一个列表,其中列出了与方法匹配的运算符:。值得注意的是:
C#中的运算符&
是F#中的运算符&&
,您可以直接使用,无需创建新的专用运算符。细节如下。啊,好的,很好,我会的
let bothHeads = Variable.op_BitwiseAnd(firstCoinHeads, secondCoinHeads)
type Variable<'t> with
static member (&.)(a, b) = Variable<bool>.op_BitwiseAnd(a, b)
let bothHeads = firstCoinHeads &. secondCoinHeads