2012-01-31 77 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