使用GHC9.0.1的神秘Unicode输出

更新:密切关注GHC 9.0.1中的这个错误作为可能的罪魁祸首。

在 GHC 9.0.1 下构建时,我在Haskell 包中看到了一些奇怪的 Unicode 行为。我知道解决这个问题可能涉及检查其他 Haskell 包中的更改,但我在这里的问题是我看到的意外输出是否会响起任何 Unicode 铃声(Haskell 或其他),以便我可以开始追踪原因意外的输出。

我希望看到的地方,分别

  • ?(或946)和
  • ?(或947

我反而看到

  • ??KQHTLXOCBJSPDZRAMEWNIUYGV
  • ??EYJVCNIXWPBQMDRTAKZGFUHOS

这个输出也有一些令人沮丧的特性,使得很难理清发生了什么:

  1. 希腊字符后面的垃圾字母,虽然在我的本地机器上总是相同的,但与我在其他平台上看到的不同(例如在 Travis CI Focal 上我得到 ??SOVPZJAYQUIRHXLNFTGKDCMB
  2. 我看到的和粘贴看到的不同。通常,前导和尾随的垃圾字符会被截断。所以我假设?实际上是一些特殊的字符。

至关重要的是,在 GHC 9 夜间解析器之前,这一切都没有发生。

希腊字符后面的意外字符模式是否与任何有助于追踪我的错误来源的内容相对应?有没有关于 GHC 9 或最新的夜间 Stackage 解析器中的软件包如何处理可能导致这种情况的 Unicode?


更新:经过一些调查后,依赖关系似乎没有改变,它似乎可以在 GHC 8.10 上工作,并且具有与 nightly 相同的依赖关系(我认为;仍在处理它)但看起来确实发生了一些奇怪的事情使用 Unicode 字符作为键。

我有


type Name = String
type Wiring = Mapping
type Turnovers = String

data Component = Component {
        name :: !Name,              -- ^ The component's 'Name'.
        wiring :: !Wiring,          -- ^ The component's 'Wiring'.
        turnovers :: !Turnovers     -- ^ The component's 'Turnovers'.
}

-- Definitions of rotor Components; people died for this information
rots_ :: M.Map Name Component
rots_ = M.fromList $ (name &&& id) <$> [
        -- rotors
        Component "I"    "EKMFLGDQVZNTOWYHXUSPAIBRCJ" "Q",
        Component "II"   "AJDKSIRUXBLHWTMCQGZNPYFVOE" "E",
        Component "III"  "BDFHJLCPRTXVZNYEIWGAKMUSQO" "V",
        Component "IV"   "ESOVPZJAYQUIRHXLNFTGKDCMWB" "J",
        Component "V"    "VZBRGITYUPSDNHLXAWMJQOFECK" "Z",
        Component "VI"   "JPGVOUMFYQBENHZRDKASXLICTW" "ZM",
        Component "VII"  "NZJHGRCXMYSWBOUFAIVLPEKQDT" "ZM",
        Component "VIII" "FKQHTLXOCBJSPDZRAMEWNIUYGV" "ZM",
        Component "?"    "LEYJVCNIXWPBQMDRTAKZGFUHOS" "",
        Component "?"    "FSOKANUERHMBTIYCWLQPZXVGJD" ""]

rotors :: [Name]
rotors = M.keys rots_

不知何故 - 仅从 GHC 9 开始 - 当namefor aComponent是希腊字符时keys,而不是只返回希腊字符,还会选择其他文本。该文本的内容因上下文而异。在我的本地机器,它总是wiring以前 Componentrots_(这是多怪异够了!),但特拉维斯CI ?追加wringIV?追加只是一个X

如果我不得不猜测,这表明编译器实际存储 Unicode 的方式发生了一些事情,这导致M.keys应用到 aComponent选择附近的一些东西,而这些东西实际上不应该是keys(或name) 的一部分。

这个真的让我难住了,远远超过了我的 Haskel 技能水平。任何帮助深表感谢。


复制:


type Name = String
type Wiring = Mapping
type Turnovers = String

data Component = Component {
        name :: !Name,              -- ^ The component's 'Name'.
        wiring :: !Wiring,          -- ^ The component's 'Wiring'.
        turnovers :: !Turnovers     -- ^ The component's 'Turnovers'.
}

-- Definitions of rotor Components; people died for this information
rots_ :: M.Map Name Component
rots_ = M.fromList $ (name &&& id) <$> [
        -- rotors
        Component "I"    "EKMFLGDQVZNTOWYHXUSPAIBRCJ" "Q",
        Component "II"   "AJDKSIRUXBLHWTMCQGZNPYFVOE" "E",
        Component "III"  "BDFHJLCPRTXVZNYEIWGAKMUSQO" "V",
        Component "IV"   "ESOVPZJAYQUIRHXLNFTGKDCMWB" "J",
        Component "V"    "VZBRGITYUPSDNHLXAWMJQOFECK" "Z",
        Component "VI"   "JPGVOUMFYQBENHZRDKASXLICTW" "ZM",
        Component "VII"  "NZJHGRCXMYSWBOUFAIVLPEKQDT" "ZM",
        Component "VIII" "FKQHTLXOCBJSPDZRAMEWNIUYGV" "ZM",
        Component "?"    "LEYJVCNIXWPBQMDRTAKZGFUHOS" "",
        Component "?"    "FSOKANUERHMBTIYCWLQPZXVGJD" ""]

以上是使用GHC9.0.1的神秘Unicode输出的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>