【问题标题】:Filtering odd length strings from a list of strings从字符串列表中过滤奇数长度的字符串
【发布时间】:2020-02-10 21:32:02
【问题描述】:

我正在解决这个问题: 使用 map、filter 和 (.)(函数组合运算符), 定义一个检查字符串列表的函数,只保留长度为奇数的字符串, 将它们转换为大写字母,并将结果连接起来生成一个字符串。

我知道我可以通过列表理解来做到这一点,但我被明确指示使用过滤器。 现在,我的代码如下所示:

concatenateAndUpcaseOddLengthStrings :: [String] -> String
concatenateAndUpcaseOddLengthStrings [] = ""
concatenateAndUpcaseOddLengthStrings xs = filter (\x -> length x `mod` 2 == 1) xs

我收到此错误: 无法将类型“[Char]”与“Char”匹配 预期类型:字符串 实际类型:[[Char]]

我在添加其他组件之前正在测试过滤器功能,但我无法克服这个错误。 有什么想法吗?

【问题讨论】:

  • 你忘了连接结果。
  • 哇哦,呵呵。在增加更多复杂性之前,我通常会尝试确保我的代码的每个组件都正常工作,所以我一定已经忽略了这一点。谢谢!

标签: haskell


【解决方案1】:

这会产生错误的原因是filter (…) xs 表达式将返回一个list fo 字符串,而不是单个字符串。但是您的类型签名指定:

concatenateAndUpcaseOddLengthStrings :: [String] -&gt; <b>String</b>

所以它需要String,而不是[String]。您可以在这里使用concat :: [[a]] -&gt; [a] 来连接字符串:

concatenateAndUpcaseOddLengthStrings :: [String] -> String
concatenateAndUpcaseOddLengthStrings xs = concat (filter (odd . length) xs)

甚至更短:

concatenateAndUpcaseOddLengthStrings :: [String] -> String
concatenateAndUpcaseOddLengthStrings = concat . filter (odd . length)

但是,您仍然需要实现这样一个事实,即它将保留的字符串中的字符转换为其大写变体。我把它留作练习。

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2017-03-20
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    相关资源
    最近更新 更多