在fsharp中,raise
函数的类型为System.Exception -> 'a
,但似乎要求您提供System.Exception
的1元素元组。这只是一个特殊的内置语法,还是还有其他类型的东西我不明白?
答案 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"
,或者当然,如果您愿意,可以在上一行声明异常说服自己,这不是一个元组。