在何处指定在Haskell实现中是否允许使用Unicode标识符?

在何处指定在Haskell实现中是否允许使用Unicode标识符?,haskell,syntax,multilingual,language-implementation,language-specifications,Haskell,Syntax,Multilingual,Language Implementation,Language Specifications,我想用Haskell编写一些教育代码,标识符中使用Unicode字符(非拉丁语)。(因此,对于使用非英语的自然语言的人来说,标识符看起来既美观又自然,因为英语在书写中没有使用拉丁字符。)因此,我着手寻找一个合适的Haskell实现,以实现这一点 但是语言规范中在哪里指定了这个特性呢?在寻找一致性实现时,我将如何引用此功能?(已知哪些Haskell实现实际支持Unicode标识符?) 事实证明,一个Haskell实现确实接受了带有Unicode标识符的代码,而另一个未能接受。我想知道是否有一种方法

我想用Haskell编写一些教育代码,标识符中使用Unicode字符(非拉丁语)。(因此,对于使用非英语的自然语言的人来说,标识符看起来既美观又自然,因为英语在书写中没有使用拉丁字符。)因此,我着手寻找一个合适的Haskell实现,以实现这一点

但是语言规范中在哪里指定了这个特性呢?在寻找一致性实现时,我将如何引用此功能?(已知哪些Haskell实现实际支持Unicode标识符?)

事实证明,一个Haskell实现确实接受了带有Unicode标识符的代码,而另一个未能接受。我想知道是否有一种方法可以形式化我的代码的这个需求,也许是语言特性转换的形式,这样如果我或其他人试图运行我的代码,就可以立即清楚地知道他的实现是否缺少所需的特性,因此他应该寻找另一个特性。(该功能还可以有一个wiki页面--“Unicode标识符”,该页面将列出支持该功能的现有实现,以便在需要时知道去哪里。)

(顺便说一句,我在这个问题上加了一个“syntax”标签,但实际上我认为这是一个词法层次的问题,比一种语言的语法层次低。这里有一个标签是针对一种语言的词法层次的特征,而不是针对一种语言的语法规范的特征吗?

下面的文档。它还指出,“Haskell使用Unicode字符集。但是,源程序目前偏向于Haskell早期版本中使用的ASCII字符集。”

实际编译器可能支持也可能不支持Unicode标识符。GHC是这样做的,但您需要记住,Unicode代码点必须遵守与ASCII字符相同的规则:类型必须以分类为大写或标题的代码点开头,变量必须以小写开头(尽管事实上这被放宽为字母顺序,而不是大写/标题;这可能值得向语言委员会寻求澄清),但运算符必须是标点符号或符号。(例如,这意味着您不能用阿拉伯语声明类型,除非在其他脚本中使用大写/titlecase字符作为前缀。)


关于收集Unicode支持信息:虽然我不知道有哪一个页面提供了Unicode支持信息,但在许多Haskell编译器中搜索会找到有关Unicode支持的信息。

至于最后一段:它是语法的一部分。它可能不是语法的一部分,而是标记化和解析之间的区别只有在实践中才存在。还有一些系统(例如解析表达式语法)跳过标记化步骤并符合实际的源代码。我的实验细节:ghc-6.10.4-(IIRC)不接受Unicode标识符,ghc-6.12.3-alt4和ghc-7.0.1-允许Unicode标识符,而hugs98-20060921-不允许Unicode标识符(这是不幸的,因为我认为它可能比ghc更适合教育,因为它更简单,即可能更简单的错误消息)。更多关于Unicode ID的相关实验:啊,我还尝试了curry-0.9.11(因为我可能想展示一些带有curry“扩展”的代码):此Muenster Curry编译器不允许使用Unicode标识符(IIRC)。感谢您通过链接提供如此快速而详细的答案!了解阿拉伯语ID等不幸情况非常有趣。(用希伯来语测试您的预测。)Haskell放松unicase书写系统的这些语法规则,或者以不同的方式陈述它们是有意义的:考虑到数学中只在公式中使用拉丁字母或希腊字母是很自然的,因此容忍unicase字母对本地绑定ID(以及所有var ID)不可用,并允许在类型名称中使用unicase字母。这样,全局函数就没有“本地化”名称,但至少有uu可以作为本地化全局函数名称的中性前缀。