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

scala – 为什么理解扩展为`withFilter`

发布时间:2020-12-16 19:10:09 所属栏目:安全 来源:网络整理
导读:我正在研究用于关系(类似SQL)运算符的DSL.我有一个Rep [Table]类型,带有.apply :((符号,…))=返回定义.flatMap的对象Obj的Obj方法:T1 = T2和.map:T1 = T3功能.由于Rep [Table]类型对基础表的模式一无所知,因此apply方法就像一个投影 – 只投影参数元组中指
我正在研究用于关系(类似SQL)运算符的DSL.我有一个Rep [Table]类型,带有.apply :((符号,…))=>返回定义.flatMap的对象Obj的Obj方法:T1 => T2和.map:T1 => T3功能.由于Rep [Table]类型对基础表的模式一无所知,因此apply方法就像一个投影 – 只投影参数元组中指定的字段(很像 untyped scalding api).现在类型T1是一个“类似元组”,它的长度受到一些无形魔法约束到投影元组的长度,但是否则元组元素的类型由api用户决定,所以代码就像

val a = loadTable(...)
val res = a(('x,'y)).map { (t: Row2[Int,Int]) =>
  (1,t(0))
}

要么

val res = a(('x,'y)).map { (t: Row2[String,String]) =>
  (1,t(0))
}

工作良好.请注意,必须显式指定map / flatMap函数的参数类型.但是,当我尝试用它来理解时

val a = loadTable(...)
val b = loadTable(...)
val c = loadTable(...)

val res = for {
  as: Row2[Int,Int] <- a(('ax,'ay))
  bs: Row2[Int,Int] <- b(('bx,'by))
  cs: Row2[Int,Int] <- c(('cx,'cy))
} yield (as(0),as(1),bs(0),bs(1),cs(0),cs(1))

它抱怨缺少一个withFilter操作符.添加.withFilter:T1 =>布尔值没有削减它 – 然后它抱怨“缺少扩展函数的参数类型”,因为T1是由某种类型参数化的.只添加.withFilter:Row [Int,Int] =>布尔值使它工作,但显然不是我想要的.

我的问题是:为什么首先调用withFilter,如何将它与我的参数化元组类型T1一起使用?

编辑
最后,我选择了.withFilter:NothingLike => BoolLike是一个用于简单检查的noop,如_.isInstanceOf [T1]和更受限制的.filter:T1 => BoolLike用于一般情况.

解决方法

不幸的是,当你期望基于lambda的参数类型的类型推断时,你不能使用for-comprehension.

实际上,在您的示例中,如下:Row2 [Int,Int]被解释为模式匹配:

val res = for {
  as: Row2[Int,'ay))
} yield (...)

转换为:

a(('ax,'ay)).withFilter(_.isInstanceOf[Row2[Int,Int]]).map(...)

理解中的模式匹配非常有用:

val names = for {
  ("name",name) <- keyValPairs
} yield name

但权衡的是,你无法明确指定lambda的参数类型.

(编辑:李大同)

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

    推荐文章
      热点阅读