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

Scala:以简单的自定义类型实现map和withFilter

发布时间:2020-12-16 21:33:30 所属栏目:安全 来源:网络整理
导读:我正在学习 Scala,并且已经不得不发现,对于我目前的知识水平,monads的概念有点太复杂了.然而,我的目标至少是使一个非常简单的类可以用于表达式,另外还有一个过滤器. 从我的理解来看,以下规则适用: 为了使自定义类型在一个for表达式的生成器中可用(生成器只
我正在学习 Scala,并且已经不得不发现,对于我目前的知识水平,monads的概念有点太复杂了.然而,我的目标至少是使一个非常简单的类可以用于表达式,另外还有一个过滤器.

从我的理解来看,以下规则适用:

>为了使自定义类型在一个for表达式的生成器中可用(生成器只生成简单变量),它需要实现map.
>如果另外使用过滤器,那么该类型也必须实现withFilter.

我的最小班看起来像这样:

class Grid(private val fields: IndexedSeq[Field])

class Field(val name: String,val isVisible: Boolean)

我想要实现的是能够做到以下几点:

for(f <- grid) yield f.name // needs map
for(f <- grid; if f.isVisisble) yield f.name // needs map + withFilter

但是,我很难找到具有这种简单性的例子.如果解决方案是“定制”到上面显示的两个类,而不是可以应用于任何类的一般解决方案,那就可以了.对这个简单的例子的执行情况肯定会帮助我.任何帮助不胜感激,谢谢.

编辑:

正如Lee指出的那样,我的意图似乎只适用于通用类型.我认为如果我忘记了类Field并重新定义Grid,将会更有意义:

class Grid[E](private val fields: IndexedSeq[E])

解决方法

在这种情况下,您可以将地图调用传递到包装的集合字段.
对于withFilter,您可以在字段上调用过滤器方法,但是我认为这并不完全符合Filtter应该具有的语义.

case class Grid[E](private val fields: IndexedSeq[E]) {
  def map[R](f: E => R): Grid[R] = new Grid(fields map f)
  def withFilter(p: E => Boolean): Grid[E] = new Grid(fields filter p)
}

你所要求的一个更正确但更复杂的实现将是:

case class Grid[E](private val fields: IndexedSeq[E]) {
  def map[R](f: E => R): Grid[R] = new Grid(fields map f)
  def withFilter(p: E => Boolean): WithFilter = new WithFilter(p)

  class WithFilter(p: E => Boolean) {
    def map[R](f: E => R): Grid[R] = new Grid(fields.withFilter(p).map(f))
    def withFilter(q: E => Boolean): WithFilter = new WithFilter(x => p(x) && q(x))
  }
}

这样,WithFilter将按预期工作lazily.

(编辑:李大同)

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

    推荐文章
      热点阅读