我刚刚开始使用 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”是错误的,但我不知道如何修复它。
任何人都可以就这个特定问题提供任何指示吗?
我认为如果你把问题分成更小的子问题可能会更好。首先,我们可以创建一个函数,对于给定的单词,将第一个字符大写。为了骆驼香烟盒,因此我们可以将其实现为:
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"
For 帕斯卡案例,我们可以利用concatMap
反而:
toCaps :: String -> String
toCaps = concatMap capWord . words
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)