加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala实现了Haskell的groupBy

发布时间:2020-12-16 18:51:38 所属栏目:安全 来源:网络整理
导读:我正在寻找 Haskell的groupBy的 Scala实现. 行为应该是这样的: isD :: Char - BoolisD c = elem c "123456789-_ "groupBy (a b - isD a == isD b) "this is a line with 0123344334343434343434-343 3345"["this"," ","is","a","line","with"," 0123344334
我正在寻找 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.我也查看了分区,但它只返回一个元组.

我正在寻找的函数应该对每个与谓词匹配的连续元素进行分组.

解决方法

像这样的问题似乎经常出现,这是一个很好的迹象IMO,Rex Kerr的分组应用方法应该包含在标准集合库中.但是,如果您不想将其复制/粘贴到项目中…

我喜欢你的递归解决方案,但它实际上并没有输出正确的东西(即字符串),所以这是我改变它的方式:

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],大概是你真正想要的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读