gpt4 book ai didi

Haskell - 将字符串中每个单词的第一个字母大写而不丢失空格

转载 作者:行者123 更新时间:2023-12-02 13:02:31 24 4
gpt4 key购买 nike

我正在做一个练习,要求我编写一个函数,将字符串中单词的所有首字母大写。

这是我到目前为止所做的:

upperFirst:: String -> String
upperFirst str = let
upperFirstForEachWord (firstLetter:others) = toUpper firstLetter : map toLower others
in unwords (map upperFirstForEachWord (words str))

这就是它的工作原理:

upperFirst "" =   ""
upperFirst "hello friends!" = "Hello Friends!"

而且:

upperFirst " " =  ""
upperFirst " a a a " = "A A A"

由于函数 words,我丢失了开头、结尾和双空格。

如何以递归方式保留它们(无需处理所有可能的情况)?

感谢您的帮助!

最佳答案

您不需要像 words 那样提取单词,而是只需分割字符串,以便每个单词开头也位于列表的开头。正如Hao Lian评论的那样,这可以通过splitOn来完成,但是标准groupBy也能达到目的:

import Data.List
import Data.Char

upperFirst = concat
. map (\(c:cs) -> toUpper c : cs)
. groupBy (\a b -> isSpace a == isSpace b)

它是如何工作的:它将全是空格或全是非空格的字符分组在一起。然后它将每个子字符串的开头大写(对空白也这样做效率有点低,但无害),然后将所有字符串重新连接在一起。

正如用户3237465所说,mapconcat的组合非常常见,并且是某种特殊情况even more common 。此外,还有a nice little combinator当按某些谓词进行分组或排序时,这会派上用场。因此你也可以将其写为

import Control.Monad
import Data.Function

upperFirst = groupBy ((==)`on`isSpace) >=> \(c:cs) -> toUpper c : cs

要充值,您可以使用 the hip modern way修改内容,对于大写部分:

import Control.Lens

upperFirst = groupBy ((==)`on`isSpace) >=> ix 0 %~ toUpper

关于Haskell - 将字符串中每个单词的第一个字母大写而不丢失空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34160196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com