Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何显式引用运算符_F# - Fatal编程技术网

F# 如何显式引用运算符

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” 这有点令人恼火……那么我如何明确

我正在尝试使用Microsoft.ML.probability,示例是C#

e、 g

现在这里有一点神奇之处,&运算符由C#编译器解析为

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