haskell - 删除空格时将单词的首字母大写(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”是错误的,但我不知道如何解决它。任何人都可以就这个特定问题提供任何指示吗?
解决方案
我认为如果你把问题分解成更小的子问题可能会更好。首先,我们可以创建一个函数,对于给定的单词,它将首字母大写。对于骆驼案例,我们因此可以将其实现为:
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
推荐阅读
- windows-10 - 使用 HTML Help Workshop 1.3 和 HTML5 和 Javascript DOM 并使用 HTML 帮助文件定位 Windows 10?
- javascript - HTML 向 PHP 提交表单,但需要使用 Javascript 进行一些解析
- visual-studio-app-center - Appcenter 管道工作正常,但现在无法构建
- tensorflow - 如何在张量流中对数组进行切片
- php - 从 PHP 中的 API 获取访问权限
- javascript - OpenLayers:我不能在事件侦听器之外获得 VectorSource 的功能吗?
- docker - 了解 docker 层和未来的变化
- java - 在被标记化后,如何将具有两种数据类型的构造函数中的数据存储到数组中?
- tinymce - TINYMCE - 如何关闭所有自动替换?
- javascript - 根据文本长度调整下拉菜单的宽度