Haskell不支持Unicode符号作为构造器(例如:◁)吗?

3

例如:

{-# LANGUAGE UnicodeSyntax #-}

data Symbolic n
  = Constant n
  | Variable String
  | Symbolic n :+ Symbolic n
  | Symbolic n :* Symbolic n
  | Symbolic n :◁ Symbolic n
  deriving (Show)

这段代码已经成功地在 GHCi 中加载。
然后我进行输入:
Constant 2 :* Variable "a"

没问题。

但是当我输入:

Constant 2 :◁ Variable "a"

*** 异常: :hPutChar: 无效参数(无效字符)

这是不是意味着Haskell不支持Unicode符号构造函数?

如何使其支持Unicode符号构造函数?

环境: GHCi 8.6.3 (WinGHCi) Windows 7

谢谢。

新观察:

当◁出现在源文件中时,它可以工作,但是您无法在REPL中输入◁(我使用的是WinGHCi)。


4
在Windows终端上,Unicode输出是一个持久而令人烦恼的问题 - 正确的答案取决于您正在运行哪种组合的shell(即powershell或cmd.com)和终端(例如ConEmu,Console2,默认的窗口终端等?)(这不是特定于Haskell的问题,但大多数Windows程序都构建为要么处理此问题,要么绕过此问题,而GHC的大多数人都在各种*nixes上)。如果您没有特别花哨的设置,那么在ghci之前运行“chcp 65001”可能就足够了。 - Cubic
请参考此链接:https://dev59.com/QWgv5IYBdhLWcg3wMN-0 - Daniel Wagner
2个回答

5
问题不在于你的代码或构造函数,而是因为你的环境没有设置好,使得Haskell无法打印Unicode字符。请尝试以下操作:
Prelude> putStrLn "\9731"

你应该看到相同的问题。

我不是一个Unicode和Windows方面的专家,但是你可以通过设置LANG=C.utf8环境变量或类似方法来解决这个问题。


https://gitlab.haskell.org/ghc/ghc/issues/8118 可能是相关的。还有 https://gitlab.haskell.org/ghc/ghc/issues/4471。以及大量其他的票 :-/ - Joachim Breitner
谢谢,但是“通过设置LANG=C.utf8环境变量”是什么意思?这是否意味着“系统环境变量”?(例如:在Windows7中,控制面板主页->系统属性->环境变量->系统变量)还是Haskell的其他配置?抱歉,我对Haskell不是很熟悉。(PS:我已经设置了系统变量LANG=C.utf8,但没有起作用) - chansey
我不熟悉Windows,抱歉。希望有其他人能在这里帮助你。 - Joachim Breitner

0

在遵循@Cubic的建议后,可以通过在运行GHCi之前运行chcp 65001来解决此问题。

我在Windows 7命令行中使用stack:

X:\you-path> chcp 65001

X:\you-path> stack ghci

*Main> Constant 2 :◁ Variable "a"

Constant 2 :◁�� Variable "a"

它有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接