对字符串操作库知之甚少我想在Haskell中自己编写这些简单的转换。我很惊讶我能够生产多少样板。我该如何简化它?使用正则表达式会产生最可读的代码吗?
期望的输出:
*Main> prettyCamel "foo-bar-example" "fooBarExample" *Main> prettyCapitals "foo-bar-example" "FooBarExample"
代码:
import Data.Char
prettyCapitals = foldr1 (++) . (map capitalize) . splitString
prettyCamel = foldr1 (++) . camelCase . splitString
capitalize (x:xs) = toUpper x : xs
camelCase [] = []
camelCase (x:xs) = x : (map capitalize xs)
splitString :: String -> [String]
splitString = foldr (splittingAdd (== '-')) []
splittingAdd splitPredicate char words =
if splitPredicate char
then "":words
else (char : headOrEmpty words) : tailOrEmpty words
headOrEmpty [] = ""
headOrEmpty (x:xs) = x
tailOrEmpty [] = []
tailOrEmpty (x:xs) = xs
答案 0 :(得分:6)
如何使用普通的旧递归?
prettyCamel "" = ""
prettyCamel ('-':c:s) = toUpper c : prettyCamel s
prettyCamel (c:s) = c : prettyCamel s
prettyCapitals (c:s) = toUpper c : prettyCamel s
或者,您可以使用Data.List.Split
包获得其中一个函数的无点版本。
prettyCapitals = concatMap capitalize . splitOn "-"
prettyCamel s = x : prettyCapitals xs
where (x:xs) = splitOn "-" s
(使用您之前对capitalize
的定义。)
答案 1 :(得分:2)
使用库和组合!
import Data.Char (toUpper)
import Data.List.Split (splitOn)
capitalize (c:cs) = toUpper c : cs
prettyCaps = concatMap capitalize . splitOn "-"
prettyCamel s = let (w:ws) = splitOn "-" s in w ++ concatMap capitalize ws
按预期工作:
>> prettyCaps "foo-bar-example"
FooBarExample
>> prettyCamel "foo-bar-example"
fooBarExample
答案 2 :(得分:1)
foldr1 (++)
在标准库中可用;它被称为concat
。 splitString
库中的数据类型text
Text
,split (== '-')
库MissingH
中split "-"
split
splitWhen (== '-')
1}}库为bytestring
,或ByteString
库中数据类型split (== '-')
为{{1}}。