【问题标题】:Haskell function head of string as input of a function字符串的 Haskell 函数头作为函数的输入
【发布时间】: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


【解决方案1】:

感谢 Willem,我使用括号找到了第一个问题。

第二个问题是关于 encryptOne 的类型问题。我现在将它添加到问题中,它显示它正在返回一个 Char,而 encrypt 函数返回一个 String。我不得不将 encryptOne 的结果从 Char 转换为 String 来解决它:

charToString :: Char -> String
charToString c = [c]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 2021-01-11
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多