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

jcc*_*333 1 f# types

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

Tom*_*cek 8

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

raise System.Exception("oops")
Run Code Online (Sandbox Code Playgroud)

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

raise (System.Exception("oops"))
Run Code Online (Sandbox Code Playgroud)

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

raise System.Exception "oops"
(raise System.Exception) "oops"
Run Code Online (Sandbox Code Playgroud)

当您添加括号(在第二行)时,您可以看到为什么这不起作用.这将是有效的,如果类型raise是像(unit -> exn) -> string -> 'a.

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

let rnd = System.Random()
sin rnd.NextDouble()
Run Code Online (Sandbox Code Playgroud)

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