Scala:以简单的自定义类型实现map和withFilter
发布时间:2020-12-16 21:33:30 所属栏目:安全 来源:网络整理
导读:我正在学习 Scala,并且已经不得不发现,对于我目前的知识水平,monads的概念有点太复杂了.然而,我的目标至少是使一个非常简单的类可以用于表达式,另外还有一个过滤器. 从我的理解来看,以下规则适用: 为了使自定义类型在一个for表达式的生成器中可用(生成器只
我正在学习
Scala,并且已经不得不发现,对于我目前的知识水平,monads的概念有点太复杂了.然而,我的目标至少是使一个非常简单的类可以用于表达式,另外还有一个过滤器.
从我的理解来看,以下规则适用: >为了使自定义类型在一个for表达式的生成器中可用(生成器只生成简单变量),它需要实现map. 我的最小班看起来像这样: 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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |