我正在阅读f#代码,我对语法感到困惑.解析器类型介绍如下:
type Parser<'r> = Parser of (char list -> ('r*char list) list)
Run Code Online (Sandbox Code Playgroud)
这由译员评估为:
type Parser<'r> = | Parser of (char list -> ('r * char list) list)
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义.然后,引入了一行新代码:'还需要应用解析器函数,因此我们为它定义了一个部分函数:',以及后面的代码:
let parse (Parser p) = p
Run Code Online (Sandbox Code Playgroud)
并且解释器输出是:
Parser<'a> -> (char list -> ('a * char list) list)
Run Code Online (Sandbox Code Playgroud)
我很惊讶这甚至是有效的语法.它是什么,为什么需要它?
非常感谢
一般来说
let f
模式的=
身体
相当于
let f = function
|
模式的 ->
身体
或者,更加冗长,
let f x =
match x with
|
模式的->
身体
这样可以避免引入一个新的标识符,该标识符会立即被解构,然后再也不会被使用.
在这个特定的例子中,这意味着parse
相当于:
let parse x =
match x with
| Parser p -> p
Run Code Online (Sandbox Code Playgroud)
由于该Parser
类型中只有一个案例,因此这种解构将永远成功.