【问题标题】:Learning Haskell: string transformations学习 Haskell:字符串转换
【发布时间】:2014-02-11 11:36:15
【问题描述】:

我对字符串操作库知之甚少,我想自己在 Haskell 中编写这些简单的转换。我很惊讶我能生产多少样板。我怎样才能简化它?使用正则表达式会产生最易读的代码吗?

期望的输出:

*Main> prettyCamel "foo-bar-example" “fooBar 示例” *Main> prettyCapitals "foo-bar-example" “FooBar 示例”

代码:

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

【问题讨论】:

  • 正则表达式根本不是haskell的惯用代码。

标签: haskell


【解决方案1】:

使用普通的旧递归怎么样?

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

【讨论】:

  • 模式匹配是一个非常强大的工具。
【解决方案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

【讨论】:

    【解决方案3】:

    foldr1 (++) 在标准库中可用;它被称为concatsplitStringtext 库中可用于数据类型 Textsplit (== '-'),在 MissingH 库中为 split "-",在 split 库中为 splitWhen (== '-'),或在 @987654331 @ 数据类型库 ByteStringsplit (== '-')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 2019-11-07
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多