这可能听起来有些荒谬,但GHC无法编制包含培根,羊角面包,黄瓜和土豆的字符串:
main = putStrLn " "
我意识到我可以轻松地写
main = putStrLn "\x1F953 \x1F950 \x1F952 \x1F954"
达到同样的效果,但我一直认为GHC会在其来源中接受任何unicode。那么: GHC在源文件中接受的unicode字符有什么实际限制?
顺便说一句:我知道支持这类事情对于GHC词法分析器来说是地狱(实际上我在为我写的词法分析器编写测试用例时遇到了上述问题),但我仍然有点失望。答案 0 :(得分:10)
将main = putStrLn " "
保存为UTF-8并在macOS上使用ghc 8.0.1
运行,我得到了:
lexical error in string/character literal at character '\129365'
我发现这与此相关(但已关闭)ghc bug report:
原因(对于这两个问题)是旧版本的GHC支持旧版本的Unicode:
$ ghc-7.0.3 -e "Data.Char.generalCategory '\8342'" NotAssigned
所以问题似乎是我们正在使用的ghc版本还不支持更新的表情符号 - 它认为unicode代码点是未分配的,即使它被分配给较新版本的unicode中的表情符号也会出错
一个相关的open ghc bug ticket,主要讨论允许哪些空白字符。
最后,lit_error
function in Lexer.x
似乎是出现错误的地方。该文件中有多个函数可以调用该错误,因此不确定它来自哪个......