【问题标题】:Recursively Printing Out Lowercase Letters递归打印小写字母
【发布时间】:2015-01-18 04:56:44
【问题描述】:

我正在做一个练习,我需要创建一个名为 allLow 的函数,该函数具有 allLow :: String -> String 的签名,它接受一个字符串并递归地打印出所有大写字母。所以它会像这样运行,

> allLow "WhERe IS MY PEPPErONI PIZZa?"
"hera"

这是我所拥有的:

allLow :: String -> String
allLow "" = ""
allLow (c:cs) = if lowerCase c = True then (c ++ (allLow cs))

我编写了一个名为“lowerCase”(Char -> Bool)的函数,如果给定的字符是小写,则返回true。我假设我可以在字符串的每个“索引”处测试小写字母的有效性,并以这种方式抽出所有大写字母,但它不起作用。错误消息对我没有帮助。它说在“=”处有一个解析错误,但我知道这意味着什么。它不应该是 == True。

【问题讨论】:

  • if upperCase c == True。为什么不应该是==?另外,如果 c 不是大写怎么办? else 条件在哪里?
  • @shree.pat18 我以为您使用 '=' 进行布尔运算,使用 '==' 进行算术运算。如果函数是大写的,我的函数“lowerCase”会打印出“False”。
  • 不。只要类型是Eq 的实例,== 在任何地方都适用于 AFAIK 平等。
  • 风格注释:不要使用== True,它是多余的。你可以简单地写if upperCase c then ... else ...。即使在英语中,“如果 c 是大写,那么..”比直接的“如果 c 是大写,那么..”更让人分心。

标签: haskell


【解决方案1】:

@shree.pat18 解决了这些问题,但我觉得有必要指出这是使用filter 函数的教科书案例...... Haskell 惯用的解决方案是

allLow = filter isLower

【讨论】:

    【解决方案2】:

    这里有很多问题:

    1. if 也需要 else
    2. == 用于比较,= 用于分配。
    3. ++ 适用于 2 个列表,您要查找的是 (:),它将一个元素附加到列表中。

    正确的函数应该是这样的:

    allCaps :: String -> String
    allCaps "" = ""
    allCaps (c:cs) = if upperCase c == True then c : allCaps cs else allCaps cs
    

    顺便说一句,Data.Char 有一个 isUpper 函数,除非创建该函数是您练习的一部分。

    Demo

    【讨论】:

    • 我说错了。我应该把它全部小写,但它是一样的。有用。谢谢!
    • if x == True then a else b 应该写成if x then a else b
    猜你喜欢
    • 2020-12-24
    • 2014-12-21
    • 2022-01-16
    • 2017-04-10
    • 1970-01-01
    • 2020-08-28
    • 2021-12-14
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多