我正在寻找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],大概是您真正想要的。

10-06 02:44