9

我想用標識符中的Unicode字符(非拉丁文)在Haskell中編寫一些教育代碼。 (這樣標識符對於非英文自然語言的演講者來說看起來很好,很自然,因爲在寫作中不使用拉丁字符)。所以,我着手尋找適當的Haskell實現來實現這一點。在何處指定是否允許在Haskell實現中使用Unicode標識符?

但如果是這個功能在語言規範中規定?在尋找合適的實現時,我將如何引用此功能? (和已知哈斯克爾implemenations實際支持Unicode標識符?)

原來,一個Haskell的實現沒有接受我使用Unicode識別碼,而另一個沒有接受它。如果有一種方法可以將我的代碼的這種需求正式化,我可能會希望它以語言功能開關的形式出現,這樣,如果我或其他人試圖運行我的代碼,立刻就會清楚他的實現是否缺失所需的功能,因此他應該尋找另一個。 (這個功能也可能有一個wiki頁面 - 「Unicode標識符」,它將列出哪些現有的實現支持它,以便人們知道如果需要它可以去哪裏。)

(順便說一句,我已經在這個問題上加了一個「語法」標籤,但我實際上認爲它是一個lexing級別的問題,這個級別比語言的語法級別要低。這裏是否有標籤的lexing級別的特徵標籤?語言,而不是語言的語法規範的特徵?)

+0

至於最後一段:它是語法的一部分。它可能不是語法的一部分,但標記化和解析之間的區別僅在實踐中存在。還有一些系統(例如Parsing Expression Grammars)可以跳過標記化步驟並迎合實際的源代碼。我的實驗 – delnan 2011-04-01 18:48:03

+1

詳情:GHC-6.10.4- [ALT2(http://prometheus.altlinux.org/en/5.1/srpms/ghc)(IIRC)不接受統一標識,GHC-6.12.3- ALT4和GHC-7.0.1- [ALT1(http://prometheus.altlinux.org/en/Sisyphus/srpms/ghc)允許使用Unicode的標識符,並且hugs98-20060921- [alt5](HTTP://prometheus.altlinux .org/en/5.1/srpms/hugs98)不允許使用Unicode標識符(這是不幸的,因爲我認爲它可能比ghc更好,因爲它更簡單,也許更簡單的錯誤消息)。 – 2011-04-01 18:53:13

+0

更多有關Unicode ID的相關實驗:啊,我也嘗試了curry-0.9.11(因爲我可能想用Curry「extensions」展示一些代碼):這個Muenster Curry Compiler不允許Unicode標識符(IIRC) 。 – 2011-04-01 19:01:55

回答

10

Online ReportLexemes下記錄這個文件。它還很早就注意到「Haskell使用Unicode字符集,但源程序目前偏向早期版本的Haskell中使用的ASCII字符集。」

實際的編譯器可能會或可能不支持Unicode標識符。 GHC,但你必須記住,Unicode代碼點必須遵守相同的規則ASCII字符:類型必須與被歸類爲大寫或首字母大寫,變量爲小寫代碼點開始(儘管事實上這是放寬到字母,而不是大寫/標題;這可能值得向語言委員會澄清),操作員必須是標點或符號。 (這意味着你不能用阿拉伯語來聲明類型,例如,除非你在其他腳本中加上大寫字母/標題的字符作爲前綴)。

至於收集Unicode支持信息:雖然我不知道提供它的單個頁面,在Haskell Wiki上搜索"unicode"可在多個Haskell編譯器中查找有關Unicode支持的信息。

+0

感謝這樣一個快速和詳盡的答案與鏈接! – 2011-04-01 19:24:06

+3

對於瞭解阿拉伯數字身份證這樣的不幸案例,這是有趣的。 (用希伯來語測試你的預測。)Haskell可以放鬆unicase書寫系統的這些語法規則,或者用不同的方式說明它們:考慮到在公式中只使用拉丁或希臘字母是很自然的事情,容忍unicase字母不能用於本地綁定的id (和所有varid),並允許在類型名稱中使用unicase字母。然後全局函數沒有「本地化」名稱,但至少有_可以是本地化全局函數名稱的中性前綴。 – 2011-04-04 00:37:11

相關問題