更新:密切关注GHC 9.0.1中的这个错误,这可能是罪魁祸首。
当我在 GHC 9.0.1 下构建时,我的 Haskell 包中出现了一些奇怪的 Unicode 行为。我知道解决这个问题可能涉及检查其他 Haskell 包中的更改,但我在这里的问题是我看到的意外输出是否响起任何 Unicode 铃声(Haskell 或其他),以便我可以开始追踪原因意外的输出。
我希望看到的地方,分别
β
(或\946
)和γ
(或\947
)
我反而看到
β?KQHTLXOCBJSPDZRAMEWNIUYGV
和γ?EYJVCNIXWPBQMDRTAKZGFUHOS
此输出还具有一些令人沮丧的属性,难以弄清楚发生了什么:
- 希腊字符后面的垃圾字母虽然在我的本地机器上总是相同,但与我在其他平台上看到的那些不一样(例如,在我得到
β?SOVPZJAYQUIRHXLNFTGKDCMB
的 Travis CI Focal 上) - 当我粘贴我看到的东西时,我看到的和得到的是不同的。通常,前导和尾随的垃圾字符会被截断。所以我认为这
?
实际上是一些特殊字符。
至关重要的是,在 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 开始——当name
for aComponent
是一个希腊字符keys
时,而不是只返回希腊字符,还会选择其他文本。该文本的内容因上下文而异。在我的本地机器上,它总是wiring
for前一个 Component
in (这太rots_
奇怪了!),但在Travis CI β
上附加了wring
forIV
并且γ
只附加了一个X
.
如果我不得不猜测,这表明编译器实际存储 Unicode 的方式发生了一些事情,导致M.keys
应用于 aComponent
来选择我们附近实际上不应该属于keys
(或name
) 的东西。
这个真的让我很难过,而且远远高于我的 Haskel 技能水平。任何帮助深表感谢。
要复制:
stack update
stack unpack crypto-enigma-0.1.1.6
cd crypto-enigma-0.1.1.6
rm -f stack.yaml && stack init --resolver nightly
stack build --resolver nightly --haddock --test --bench --no-run-benchmarks