我只是碰到了一塊的Haskell代碼的語法如下跑 -這是什麼Haskell語法?
data A = A Int Int | B
m :: A -> Int
m a = case a of
A{} -> 1
_ -> 2
什麼A{}
在這裏做什麼? {}
是否可以自動匹配任意數量的參數?
我有一種感覺,這是利用Haskell記錄語法desugars到一堆函數和常規代數數據類型的事實。是這樣嗎?
我只是碰到了一塊的Haskell代碼的語法如下跑 -這是什麼Haskell語法?
data A = A Int Int | B
m :: A -> Int
m a = case a of
A{} -> 1
_ -> 2
什麼A{}
在這裏做什麼? {}
是否可以自動匹配任意數量的參數?
我有一種感覺,這是利用Haskell記錄語法desugars到一堆函數和常規代數數據類型的事實。是這樣嗎?
是,A{}
與A
構造建造的任何值匹配,不管類型是否已宣佈創紀錄的語法與否。
表達式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′ }
該語法很有用,因爲即使構造函數「A」的參數數量發生變化,函數定義也不需要改變。使用常規模式匹配(例如'A _ _ - > ...'),情況就不會如此。 – 2012-01-18 06:54:49
@丹尼爾 - 但在這種情況下,我們不是在表達,而是模式。我認爲'F {}'應該等價於'F _1 _2 ... _n',其中* n *是構造函數的arity。 – Ingo 2012-01-18 11:21:27
@Ingo正確。只看昨晚的'非正式語義'部分,沒有找到任何東西,但表達部分脫穎而出。睡幾個小時後,在正式的語義部分找到它。 – 2012-01-18 11:53:40
每天學習新東西,我已經編程Haskell 5年了;從未見過我生命中的語法。 – 2012-01-18 06:34:36