(在我的实际用例中,我有一个 type 列表[SomeType]
,SomeType
具有有限数量的构造函数,全部为空;在下面我将使用String
而不是[SomeType]
并且仅使用 4 Char
s,以简化一点。)
我有一个这样的列表"aaassddddfaaaffddsssadddssdffsdf"
,其中每个元素都可以是'a'
, 's'
, 'd'
,中的一个'f'
,并且我想对每个连续的非a
s 序列做一些进一步的处理,比如说将它们变成大写并反转序列,从而获得"aaaFDDDDSSaaaSSSDDFFaFDSFFDSSDDD"
. (我添加了反转要求,以明确处理同时涉及所有连续的非'a'
-s。)
要转换每个子String
大写,我可以使用这个:
func :: String -> String
func = reverse . map Data.Char.toUpper
但是我如何只在non -sfunc
的 sub- s 上运行呢?String
'a'
我的第一个想法是这Data.List.groupBy
很有用,整体解决方案可能是:
concat $ map (\x -> if head x == 'a' then x else func x)
$ Data.List.groupBy ((==) `on` (== 'a')) "aaassddddfaaaffddsssadddssdffsdf"
然而,这个解决方案并不能说服我,因为我== 'a'
在分组(对我来说这似乎很好而且不可避免)和决定是否应该将一个组变为大写时都使用。
我正在寻找有关如何以最佳方式完成这项小任务的建议。