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一起使用? 编辑 解决方法
不幸的是,当你期望基于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的参数类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |