【问题标题】:Using Emoji in Haskell在 Haskell 中使用表情符号
【发布时间】:2015-11-05 01:41:28
【问题描述】:

我最近在 Twitter 上遇到了一个名为 EmojiHaskell 的机器人,它声称会在推特上发布“带有表情符号变量名的可解释 Haskell 代码”。一个特别的Tweet 引起了我的注意,因为它对我来说看起来像是格式错误的语法,所以我决定仔细看看。到目前为止,我已经生成了以下代码:

module Main where

???? :: [????] -> Maybe ????
???? [] = Nothing
???? (????:as) = Just ????

main = print $ ???? "♥"

由于我有时在我的 Haskell 代码中使用了 λ,我希望这段代码可以工作,但 GHC 似乎根本不喜欢这个表情符号。

$ runhaskell Main.hs 我得到:

Main.hs:4:1: 输入‘????’时解析错误

我已经看过UnicodeSyntax 扩展, 并尝试只使用一些或单个表情符号而不是全部使用,以查看是否是某个人引起了问题。

现在我的问题是: 目前是否有可以接受代码的 Haskell 编译器? 我可以让 GHC 以某种方式使用此代码吗?

【问题讨论】:

  • 我不知道你是否在乎,但你可以做一个预处理器。 Afaik GHC 有一个标志来运行您选择的自定义预处理器。
  • AFAIK,Unicode 语法允许您将-> 替换为,等等。 只需要在源代码中使用 Unicode 字符。 downloads.haskell.org/~ghc/latest/docs/html/users_guide/…

标签: haskell twitter ghc


【解决方案1】:

该代码不是有效的haskell。原因是?(可能是所有表情符号)是一个符号字符:

Prelude> import Data.Char
Prelude Data.Char> generalCategory '?'
OtherSymbol

但是您仍然可以像使用任何其他符号一样使用它们,即作为运算符:

Prelude Data.Char> let (?) = (+)
Prelude Data.Char> 32 ? 42
74

此外,正如 user3237465 所指出的,如果您对运算符使用前缀语法,即把它放在括号中,您甚至可以像使用任何其他符号一样使用它:

(?) :: [a] -> Maybe a
(?) [] = Nothing
(?) ((?):as) = Just (?)

main = print $ (?) "♥"

这几乎是原始帖子中的示例。不幸的是,这个技巧不适用于类型变量。 the documentation 措辞有点遗憾,但 in fact 符号永远不是类型变量,始终是类型构造函数

【讨论】:

  • 运算符不必是中缀,所以这是合法的:(?) [] = Nothing; (?) ((?):as) = Just (?); main = print $ (?) "a".
  • 谢谢。我错误地认为(?) 会强制它具有一个接受两个参数的函数类型,但这似乎仅适用于运算符部分。错误#10772 提交了关于它在类型级别上不起作用的问题。
  • 啊,看到来自 user3237465 的提示后的更新非常酷 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-23
  • 2019-05-07
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 2020-06-07
相关资源
最近更新 更多