2012-01-31 51 views
2

我正在阅读f#代码,我对语法感到困惑。解析器型介绍如下:如何解释f#中的这个部分函数语法?

type Parser<'r> = Parser of (char list -> ('r*char list) list) 

这是通过解释器评价为:

type Parser<'r> = | Parser of (char list -> ('r * char list) list) 

这是有意义的我。然后,新的代码线被引入:“A解析器功能也需要施加所以我们定义一个局部函数是:”和后面的代码:

let parse (Parser p) = p 

和解释器的输出是:

Parser<'a> -> (char list -> ('a * char list) list) 

我很惊讶这是甚至有效的语法。这是什么,为什么它需要?

非常感谢

回答

9

一般而言

let f图案=

相当于

let f = function
|图案->

,或者甚至更冗长,

let f x =
    match x with
    |图案->

这允许你避免引入一个新的标识符被立即解体,然后就不再使用。

在这个特定的例子中,这意味着parse相当于:

let parse x = 
    match x with 
    | Parser p -> p 

由于只有在Parser类型的单个情况下,该解构将总是成功。

+0

非常感谢,upvoted并接受为答案。我不知道使用的符号是模式匹配表达式的简写,函数被绑定到p。 (Pattern p)没有意义,我认为它应该是(p:Pattern)或其他东西,但现在它是有意义的。 – 2012-01-31 15:14:42

3

如果你理解为一个黑盒子的(char list -> ('r*char list) list)类型,你可以很容易地interprete这些类型。

type Parser<'r> = Parser of R<'r> 

在声明函数:

let parse (Parser p) = p 

类型检查推断

假设我们有一个类型的缩写:如

type R<'r> = char list -> ('r*char list) list 

然后Parser<'r>可以写成参数类型Parser<'r>(通过查看结构o f Parser p)。因此,返回值p显然有R<'r>类型:

val parse : Parser<'a> -> R<'a> 

可以想像,它的真正的声明取代R<'r>

val parse : Parser<'r> -> (char list -> ('r*char list) list) 

所以在这里推断类型完全意义。

+0

谢谢,upvoted。 – 2012-01-31 15:15:24