为什么加注要求你提出参数?

时间:2014-11-26 15:51:49

标签: types f#

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

2 个答案:

答案 0 :(得分:8)

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

raise System.Exception("oops")

..但相反,我必须在创建异常的表达式周围加上括号:

raise (System.Exception("oops"))

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

raise

当您添加括号(在第二行)时,您可以看到为什么这不起作用。如果(unit -> exn) -> string -> 'a的类型类似于let rnd = System.Random() sin rnd.NextDouble() ,那么这将是有效的。

这是解析F#表达式的一般属性。你写的时候可以得到同样的东西。

sin(rnd.NextDouble())

在这里,你还需要写sin rnd.NextDouble (),否则它被视为:
 {{1}}。

答案 1 :(得分:3)

它只是以这种方式解析它。 F#积极地解析,这意味着因为raise需要一个元素,它会抓取第一个完整元素并尝试提供它。在你的情况下,第一个完整的元素是System.Exception构造函数,因此它看到的不是匹配,而是退出。

因此,您只需要对其进行括号化,以便编译器识别您想要的内容,或者另一种方法是对其进行反向管道:raise <| System.Exception "fail",或者当然,如果您愿意,可以在上一行声明异常说服自己,这不是一个元组。