2013-03-06 82 views
2

好的,所以這裏是一個不尋常的。每當您看到Haskell的記錄語法示例時,它總是看起來像記錄語法澄清

Sphere {center = 0, radius = 2} 

或類似。我的問題是......那些花括號實際上是記錄語法的一部分嗎?或者他們實際上是佈局的簡寫?換句話說,你真的可以寫點類似於

Sphere 
    center = 0 
    radius = 2 

並且它有效嗎?

我懷疑這將是非常有用的做到這一點 - 它佔用了大量的視覺空間 - 但我只是好奇,這在語法上是否有效與否。

+0

恕我直言,很容易就可以試用。 – 2013-03-06 21:11:40

回答

6

佈局是顯式花括號和分號的替代方案。

記錄語法使用明確的大括號和逗號

所以不,你不能使用佈局作爲記錄語法的一部分。

Haskell Report 2010 §2.7 Layout:

Haskell中允許括號和在幾個語法產生使用分號的遺漏,通過使用佈局傳達相同的信息。

+1

即使記錄語法使用分號,只要沒有規則構造函數ID會觸發插入大括號,它仍然不起作用... – Ingo 2013-03-06 21:32:02

6

好吧,好吧,我想我會把這個問題放在這裏,以防有人感興趣。經諮詢哈斯克爾報告本身,它看來,括號字面上記錄結構的正式部分:

http://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-690004.2.1

這意味着,這些標記實際上有兩種不同的含義在Haskell - 爲申報分隔符時佈局沒有被使用,並作爲記錄分隔符。我敢打賭,這會導致一些有趣的解析器邊緣案例!

(我也順便指出EmptyDataDecls默認顯示是在2010年的Haskell,這是值得了解的......)

+1

關於解析器:這不是問題,因爲其他類型的大括號只能出現在讓,在,在哪裏和在哪裏。雖然記錄大括號總是受到構造函數ID的保護。 – Ingo 2013-03-06 21:25:39

+0

@Ingo和'if',和'=',和......但是,關鍵是記錄始終以構造函數名稱開頭。 – MathematicalOrchid 2013-03-06 21:27:30

+0

{if'後出現的怎麼樣? – Ingo 2013-03-06 21:29:21

1

Sphere後,詞法分析器將不插入支架。爲什麼要這樣?你不要指望在代碼中插入一個大括號:

z = x 
    + y 

不是嗎?

+0

的確如此。然而,上面的片段確實解析了。 – MathematicalOrchid 2013-03-06 21:33:56

+0

是的,它確實解析,*正是因爲*沒有大括號。 – Ingo 2013-03-06 21:37:24

+0

嗯,有趣。我認爲詞法分析器每次縮進都會插入一個'{',每次縮小時都會插入'}'。顯然,實際發生的事情更加複雜...... – MathematicalOrchid 2013-03-06 21:39:07