【发布时间】:2020-03-19 00:14:58
【问题描述】:
我正在 Haskell 中创建一个 Enigma Machine,但以下代码有问题:
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
问题出在encryptOneheadt [d1, d2, d3]部分,headt无法解决,出现如下错误
length t == 1 = encryptOne head t [d1, d2, d3]
^^^^
* Couldn't match type `Char' with `[Char]'
Expected type: [String]
Actual type: String
有谁知道如何重构此部分,以便 head t 返回要在 encryptOne 中使用的 Char?
【问题讨论】:
-
这里需要使用正确的括号,所以
encryptOne (head t) [d1, d2, d3]。 -
这确实部分解决了它。我也找到了解决方案,因为我返回的是一个字符,而加密应该返回一个字符串
-
所以
encryptOne返回Char类型,但您尝试像encryptOne (head t) [d1, d2, d3] ++ ...一样连接。您应该改用 cons(:)。
标签: haskell higher-order-functions head