首页 > 解决方案 > 删除空格时将单词的首字母大写(Haskell)

问题描述

我刚从 Haskell 开始,这就像我正在写的第三件事,所以,自然地,我发现自己有点难过。

我正在尝试编写一些代码,该代码将采用一个字符串,删除空格并将该字符串的每个字母大写。

例如,如果我输入“这是一个测试”,我想返回类似:“thisIsATest”

import qualified Data.Char as Char

toCaps :: String -> String
toCaps [] = []
toCaps xs = filter(/=' ') xs
toCaps (_:xs) =  map Char.toUpper xs 

我认为我使用的方法是错误的。按此顺序使用我的代码,我可以使用该filter函数删除所有空格,但没有任何内容变为大写。

当我将filter位移动到代码的最后时,我可以使用该map Char.toUpper位。例如,当我映射该函数Char.toUpper时,它只是将所有“HISISATEST”都大写。我试图利用 if 函数说类似的话

if ' ' then map Char.toUpper xs else Char.toLower xs,但这对我不起作用。我还没有if在 Haskell 中使用过,而且我认为我做得不对。我也知道使用“xs”是错误的,但我不知道如何解决它。任何人都可以就这个特定问题提供任何指示吗?

标签: haskell

解决方案


我认为如果你把问题分解成更小的子问题可能会更好。首先,我们可以创建一个函数,对于给定的单词,它将首字母大写。对于骆驼案例,我们因此可以将其实现为:

import Data.Char(toUpper)

capWord :: String -> String
capWord "" = ""
capWord (c:cs) = toUpper c : cs

然后我们可以使用words来获取单词列表:

toCaps :: String -> String
toCaps = go . words
    where go [] = ""
          go (w:ws) = concat (w : map capWord ws)

例如:

Prelude Data.Char> toCaps "this is a test"
"thisIsATest"

对于Pascal 案例,我们可以concatMap改用:

toCaps :: String -> String
toCaps = concatMap capWord . words

推荐阅读