递归打印小写字母

Recursively Printing Out Lowercase Letters

我正在做一个练习,我需要创建一个名为 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) 如果给定的 char 是小写的,它 returns 为真。我假设我可以在字符串的每个 "index" 处测试小写字母的有效性并以这种方式抽出所有大写字母,但它不起作用。错误消息对我没有帮助。它说“=”处存在解析错误,但我不知道那是什么意思。它不应该是 == True。

这里有很多错误:

  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

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

allLow = filter isLower