在 Haskell 中用“?”替换“->”,用“?”替换“=>”等等

Zhi*_*gor 17 haskell character special-characters

网上有很多有趣的片段。这篇文章可以在这个(很棒的)堆栈溢出问题下找到作者写道:

discount ? Floating ? ? ? ? ? ? ? ? ?
discount ? df x = x * (1 + df) ** (-?)
Run Code Online (Sandbox Code Playgroud)

那些花哨的箭头和点只是让在线页面看起来更好的一种方式,还是有一个实际的 Haskell 扩展(或其他什么,我不太了解术语)可以编译这样的东西?我应该注意到,->代码中也使用了通常的。

我有一种强烈的感觉,这不是我第一次看到这样的事情。

K. *_*uhr 25

有一个 GHC 扩展称为UnicodeSyntax允许某些语法的一些Unicode 替代方案。但是,一般来说,Haskell 源代码是用 Unicode 编写的,因此即使没有任何扩展名,也可以在普通的 Haskell 源代码中使用非 ASCII 字符作为标识符和运算符。

在问题中包含的代码片段中,作者同时使用了这两种工具。他们使用UnicodeSyntax允许Unicode字符???代替内置的::=>->语法,但他们使用的书写正规Haskell的Unicode支持??标识符。

以下程序在没有任何扩展的情况下有效:

discount :: Floating ? => ? -> ? -> ? -> ?
discount ? df x = x * (1 + df) ** (-?)
Run Code Online (Sandbox Code Playgroud)

  • 是的,希腊字母或中缀符号(如“a⚡b = a*2 + b”)无需任何扩展名即可使用。我个人专门使用“-XUnicodeSyntax”来编写“∀”而不是“forall”。OTOH,在我看来,“→”和“⇒”符号只会使类型签名的可读性低于“->”和“=>”。 (6认同)

chi*_*chi 18

从 GHC 文档:

语言扩展UnicodeSyntax允许使用 Unicode 字符来代表某些 ASCII 字符序列。