我正在Haskell中创建一个Enigma机器,并且我对以下代码有疑问:
encrypt :: String -> [String] -> String
encrypt t [d1, d2, d3]
| length t > 1 = encryptOne head t [d1, d2, d3] ++ encrypt (tail t) [d1, d2, rotateF d3]
| length t == 1 = encryptOne head t [d1, d2, d3]
| otherwise = ""
加密函数采用字符串,并使用encryptOne
函数递归求解每个字符。每次迭代时,都使用rotateF
功能旋转转子(早期阶段,仍在解决此问题)。 encryptOne
函数如下所示:
encryptOne :: Char -> [String] -> Char
问题是encryptOne
头t [d1, d2, d3]
部分,其中无法解决头t
,并且发生以下错误
length t == 1 = encryptOne head t [d1, d2, d3]
^^^^
* Couldn't match type `Char' with `[Char]'
Expected type: [String]
Actual type: String
有人知道如何重构此部分,以便头t
返回要在encryptOne
中使用的字符吗?
感谢威廉,我使用括号找到了第一个问题。
第二个问题是关于encryptOne
的类型问题。我现在将其添加到问题中,它表明它正在返回Char,而crypto函数返回String。我必须将encryptOne
的结果从Char转换为String才能解决:
charToString :: Char -> String
charToString c = [c]