递归打印小写字母

时间:2015-01-18 04:56:45

标签: haskell

我正在做一个练习,我需要创建一个名为allLow的函数,它具有allLow :: String -> 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是小写,则返回true。我假设我可以在每个"指数"中测试lowerCase的有效性。字符串并用那个方式抽出所有大写字母,但它不起作用。错误消息对我没有帮助。它说'' ='有一个解析错误。但Idk意味着什么。它不应该是==真。

2 个答案:

答案 0 :(得分:5)

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

allLow = filter isLower

答案 1 :(得分:4)

这里有点不对劲:

  1. if也需要else
  2. ==用于比较,=用于分配。
  3. ++适用于2个列表,您要查找的是(:),它会将一个元素附加到列表中。
  4. 正确的功能应如下所示:

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

    BTW,Data.Char具有isUpper功能,除非创建该功能是您练习的一部分。

    Demo