【问题标题】:Create concatenate function in Haskell: [String] -> String在 Haskell 中创建连接函数:[String] -> String
【发布时间】:2015-04-18 23:20:13
【问题描述】:

我在让这个功能工作时遇到了很多麻烦:

concatenate :: [String] -> String

它被设计为简单地获取一个字符串列表并返回一个字符串,该字符串是列表中每个元素从头到尾连接的结果。我试图留在mapfoldlfoldr 函数内。我觉得我知道这些函数的概念做得很好,但我遇到的最常见的问题是我遇到了类型冲突。例如,GHC 会期望一个 [Char],我将输入显然试图在我不知道的情况下使用 [[Char]] 的代码。

例如:concatenate (x:xs) = foldr (++) x (concatenate xs)

我得到以下编译错误:

Couldn't match type `Char' with `[Char]'
Expected type: [[Char]]
  Actual type: String
In the return type of a call of `concatenate'
In the third argument of `foldr', namely `(concatenate xs)'
In the expression: foldr (++) x (concatenate xs)

我是非常 Haskell 的新手,所以请尽情发笑。只要还包括适合新手的解释,就可以预料到苛刻并受到欢迎。感谢您的所有帮助。

【问题讨论】:

    标签: string list haskell fold


    【解决方案1】:

    您实际上不需要那里的递归调用。函数foldr 已经模拟了递归调用。您需要做的就是使用:

    concatenate :: [String] -> String
    concatenate ls = foldr (++) "" ls
    

    请记住,concat function 已经有了,它更通用,因为它适用于任何列表列表(而不是简单的字符串列表)。

    【讨论】:

    • 就这么简单...谢谢。从 C 开始后,我很难进入在 Haskell 中开发函数所需的心态。关于concat,我知道它存在,但我试图通过制作自己的版本来理解这些基本功能。过去它似乎对其他语言有所帮助。
    猜你喜欢
    • 2011-07-11
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2019-04-12
    相关资源
    最近更新 更多