学习Haskell:字符串转换

时间:2014-01-21 17:50:27

标签: haskell

对字符串操作库知之甚少我想在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

3 个答案:

答案 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 (++)在标准库中可用;它被称为concatsplitString库中的数据类型text Textsplit (== '-')MissingHsplit "-" split splitWhen (== '-') 1}}库为bytestring,或ByteString库中数据类型split (== '-')为{{1}}。