(在我的实际用例中,我有一个 type 列表[SomeType],SomeType具有有限数量的构造函数,全部为空;在下面我将使用String而不是[SomeType]并且仅使用 4 Chars,以简化一点。)
我有一个这样的列表"aaassddddfaaaffddsssadddssdffsdf",其中每个元素都可以是'a', 's', 'd',中的一个'f',并且我想对每个连续的非as 序列做一些进一步的处理,比如说将它们变成大写并反转序列,从而获得"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'在分组(对我来说这似乎很好而且不可避免)和决定是否应该将一个组变为大写时都使用。
我正在寻找有关如何以最佳方式完成这项小任务的建议。