Types 为什么raise要求您对参数进行元组化?

Types 为什么raise要求您对参数进行元组化?,types,f#,Types,F#,在fsharp中,raise函数的类型为System.Exception->'a,但它似乎要求您提供System.Exception的1元素元组。这只是一种特殊的内置语法,还是类型中还有其他一些我不理解的地方?如果我正确理解了你的问题,你会问我为什么不能写: raise System.Exception("oops") 。。但是,我必须在创建异常的表达式周围加上括号: raise (System.Exception("oops")) 解释是编译器实际上将前者解释为使用两个独立参数调用rais

在fsharp中,raise函数的类型为System.Exception->'a,但它似乎要求您提供System.Exception的1元素元组。这只是一种特殊的内置语法,还是类型中还有其他一些我不理解的地方?

如果我正确理解了你的问题,你会问我为什么不能写:

raise System.Exception("oops")
。。但是,我必须在创建异常的表达式周围加上括号:

raise (System.Exception("oops"))
解释是编译器实际上将前者解释为使用两个独立参数调用raise,第一个是标识符System.Exception,第二个是带括号的字符串参数。即:

raise System.Exception "oops"
(raise System.Exception) "oops"
当您在第二行添加括号时,您可以看到为什么这不起作用。如果加薪的类型类似于unit->exn->string->a,那么这将是有效的

这是解析F表达式的一般属性。你可以在写作时得到同样的结果

let rnd = System.Random()
sin rnd.NextDouble()
在这里,您还需要编写sinrnd.NextDouble,否则它将被视为:
sin rnd.NextDouble.

如果我正确理解了你的问题,你会问我为什么不能写:

raise System.Exception("oops")
。。但是,我必须在创建异常的表达式周围加上括号:

raise (System.Exception("oops"))
解释是编译器实际上将前者解释为使用两个独立参数调用raise,第一个是标识符System.Exception,第二个是带括号的字符串参数。即:

raise System.Exception "oops"
(raise System.Exception) "oops"
当您在第二行添加括号时,您可以看到为什么这不起作用。如果加薪的类型类似于unit->exn->string->a,那么这将是有效的

这是解析F表达式的一般属性。你可以在写作时得到同样的结果

let rnd = System.Random()
sin rnd.NextDouble()
在这里,您还需要编写sinrnd.NextDouble,否则它将被视为:
sin rnd.NextDouble.

它只是以这种方式解析它。F进行积极的解析,这意味着由于raise只接受一个元素,它会获取第一个完整的元素并尝试为其提供数据。在您的例子中,第一个完整的元素是System.Exception构造函数,因此它看到不匹配,并退出


因此,您只需要将它括起来,以便编译器识别您想要的内容,或者另一种方法是使用管道对其进行反向传输:raise它只是以这种方式对其进行解析。F进行积极的解析,这意味着由于raise只接受一个元素,它会获取第一个完整的元素并尝试为其提供数据。在您的例子中,第一个完整的元素是System.Exception构造函数,因此它看到不匹配,并退出


因此,您只需要将它括起来,以便编译器识别您想要的内容,或者另一种方法是通过管道将其返回:raise Gotcha。我对解析的优先顺序感到困惑,我想是吧?类型构造函数与普通函数的比较。明白了。我对解析的优先顺序感到困惑,我想是吧?类型构造函数与普通函数的比较。F中没有语法1元素元组。可能的混淆来源:parens不在F中创建元组,逗号是。明确的混淆来源。多谢了,F中没有语法上的1元元组。一个可能的混淆来源:Paren不在F中创建元组,逗号是。一个明确的混淆来源。谢谢