学习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
答
如何使用普通的旧递归?
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 (++)
是在标准库可用;它叫做concat
。 splitString
处于text
库的数据类型作为Text
可用split (== '-')
,在MissingH
库作为split "-"
,在split
库作为splitWhen (== '-')
,或者在bytestring
库数据类型ByteString
为split (== '-')
。
答
利用图书馆和组成!如预期
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
正则表达式是不是哈斯克尔在所有的习惯代码。 – Sibi