我正在寻找Haskell的groupBy的Scala实现。
行为应如下所示:
isD :: Char -> Bool
isD c = elem c "123456789-_ "
groupBy (\a b -> isD a == isD b) "this is a line with 0123344334343434343434-343 3345"
["this"," ","is"," ","a"," ","line"," ","with"," 0123344334343434343434-343 3345"]
我尝试了Scala groupBy函数,但是它只使用一个参数的函数,而不是Haskell的2。我也查看了partition,但是它仅返回一个元组。
我正在寻找的功能应该将与谓词匹配的每个连续元素进行分组。
最佳答案
像这样的问题似乎经常出现,这很好地表明了IMO的想法,即Rex Kerr的groupedWhile
方法应包含在标准馆藏库中。但是,如果您不想将其复制/粘贴到您的项目中...
我喜欢您的递归解决方案,但实际上并没有输出正确的东西(即字符串),因此,这是我将其更改的方法:
def groupBy(s: String)(f: (Char, Char) => Boolean): List[String] = s match {
case "" => Nil
case x =>
val (same, rest) = x span (i => f(x.head, i))
same :: groupBy(rest)(f)
}
然后,使用您的功能并在REPL中进行尝试:
val isD = (x: Char) => "123456789-_ " contains x
groupBy("this is a line with 0123344334343434343434-343 3345")(isD(_) == isD(_))
结果是
List[String]
,大概是您真正想要的。