学习Haskell:字符串转换

问题描述:

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

正则表达式是不是哈斯克尔在所有的习惯代码。 – Sibi

如何使用普通的旧递归?

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定义。)

+0

模式匹配是一个非常强大的工具。 – karakfa

foldr1 (++)是在标准库可用;它叫做concatsplitString处于text库的数据类型作为Text可用split (== '-'),在MissingH库作为split "-",在split库作为splitWhen (== '-'),或者在bytestring库数据类型ByteStringsplit (== '-')

利用图书馆和组成!如预期

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