什么是“无”(scala)?
我看到一个名为“at”的对象(可能是一个函数)洒在整个无形源和使用无形的代码中.特别是在
this other question的答案中使用了这个代码片段:
object iterateOverHList extends Poly1 { implicit def iterable[T,L[T] <: Iterable[T]] = at[L[T]](_.iterator) } 我有一些线索,它与?>的应用方法有关类型.什么具体地做“做”,它在哪里定义? 解决方法
PolyN#的定义
是与Poly合作的一般方式. ?>适用于Poly1的special case.这里应用的是用于定义隐式方法使用: implicit def caseUniv[T] = at[F[T]](apply(_)) PolyN中的方法是defined(例如Poly1),如下所示: trait PolyN extends Poly { outer => type Case[T1,T2,...,TN] = poly.Case[this.type,T1 :: T2 :: ... :: TN :: HNil] object Case { type Aux[T1,TN,Result0] = poly.Case[outer.type,T1 :: T2 :: ... :: TN :: HNil] { type Result = Result0 } } class CaseBuilder[T1,TN] { def apply[Res](fn: (T1,TN) => Res) = new Case[T1,TN] { type Result = Res val value = (l: T1 :: T2 :: ... :: TN :: HNil) => l match { case a1 :: a2 :: ... :: aN :: HNil => fn(a1,a2,aN) } } } def at[T1,TN] = new CaseBuilder[T1,TN] } 在Poly1的情况下: trait Poly1 extends Poly { outer => type Case[T1] = poly.Case[this.type,T1 :: HNil] object Case { type Aux[T1,T1 :: HNil] { type Result = Result0 } } class CaseBuilder[T1] { def apply[Res](fn: (T1) => Res) = new Case[T1] { type Result = Res val value = (l: T1) => l match { case a1 :: HNil => fn(a1) } } } def at[T1] = new CaseBuilder[T1] } 所以在[Int]创建一个CaseBuilder [Int]和[Int] .apply [String](_.toString)的实例,或者在[Int](_.toString)(应用程序调用的synax sugar)创建一个实例的poly.Case [this.type,Int :: HNil] {type Result = String}. 因此,使用隐式def迭代[T,L [T]
def map(f : Poly)(implicit mapper : Mapper[f.type,L]) : mapper.Out = mapper(l) (L是HList的类型) 为Case1 [Fn,T]创建Mapper编译器looks. 对于Map(f)在A :: B :: … :: HNil编译器必须找到Case1 [f.type,A],Case1 [f.type,B]等等的含义. 在List [Int] :: HNil的情况下,唯一需要的隐藏Case1是Case1 [f.type,List [Int]]. 请注意,Case1为defined,如下所示: type Case1[Fn,T] = Case[Fn,T :: HNil] 所以我们必须为Case [f.type,List [Int] :: HNil]找到一个隐含的值. 如果f是一个对象,则搜索隐含的地方之一是f域和方法.所以编译器会在f中找到Case定义. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- WebService——wsimport命令建立webService本地客户端
- macos – 如何从系统剪贴板粘贴到控制台Vim?
- 在vim中使用代码完成,就像在sublime文本中一样
- webservice的几种验证方式(一)基于JAX-WS
- 哪些服务在AngularJS中转换元素和attr名称?
- kubernetes Node节点部署(四)
- scala – 为什么Try [Try [Unit]]值可以分配给Try [Unit]?
- twitter-bootstrap – Bootstrap 4自定义变量不会覆盖
- Sublime Text2插件安装(win)
- -bash: ls: No such file or directory 产生的原因及修改方