2012-01-18 144 views
28

我只是碰到了一塊的Haskell代碼的語法如下跑 -這是什麼Haskell語法?

data A = A Int Int | B 

m :: A -> Int 
m a = case a of 
    A{} -> 1 
    _ -> 2 

什麼A{}在這裏做什麼? {}是否可以自動匹配任意數量的參數?

我有一種感覺,這是利用Haskell記錄語法desugars到一堆函數和常規代數數據類型的事實。是這樣嗎?

+5

每天學習新東西,我已經編程Haskell 5年了;從未見過我生命中的語法。 – 2012-01-18 06:34:36

回答

28

是,A{}A構造建造的任何值匹配,不管類型是否已宣佈創紀錄的語法與否。

language report指定

表達式f {},其中,F是一個數據構造,是合法的F是否或不與記錄語法(提供F具有沒有嚴格的字段聲明 - 參見上面的第四子彈);它表示F⊥1...⊥n,其中n是F的元數

在括號中提到的「第四子彈說,它是一個靜態誤差構建具有記錄語法的值忽略了嚴格領域。

而在上pattern matching的部分中,用於模式的語法規則之一是

apat -> qcon { fpat1 , … , fpatk }  (labeled pattern, k ≥ 0) 

和語義在模式匹配(3.17.3)的形式語義小節作爲

給出
(o) case v of { K {} -> e ; _ -> e′ } 
     = case v of { 
      K _… _ -> e ; _ -> e′ } 
+3

該語法很有用,因爲即使構造函數「A」的參數數量發生變化,函數定義也不需要改變。使用常規模式匹配(例如'A _ _ - > ...'),情況就不會如此。 – 2012-01-18 06:54:49

+0

@丹尼爾 - 但在這種情況下,我們不是在表達,而是模式。我認爲'F {}'應該等價於'F _1 _2 ... _n',其中* n *是構造函數的arity。 – Ingo 2012-01-18 11:21:27

+0

@Ingo正確。只看昨晚的'非正式語義'部分,沒有找到任何東西,但表達部分脫穎而出。睡幾個小時後,在正式的語義部分找到它。 – 2012-01-18 11:53:40