Scala类型类继承疑问:Applicative约束下为何map方法无法调用?
问题原因解析
你的代码里,Applicative[F[_]: Functor]这个上下文约束只是要求存在Functor[F]实例才能创建Applicative[F]实例,但它不会把Functor[F]的隐式实例自动带到使用Applicative[F]的作用域里。
具体到<*>函数,它的约束是F[_]: Applicative,这意味着当前作用域里只有Applicative[F]的隐式实例,而编译器解析fa.map时,需要的是Functor[F]的隐式实例——虽然Applicative[F]的存在依赖于Functor[F],但编译器不会主动从Applicative[F]的依赖里提取Functor[F]实例到当前作用域,所以就找不到map方法。
两种解决办法
- 直接给
<*>函数加上Functor约束,写成def <*[A, B, F[_]: Applicative: Functor](fa: F[A], fb: F[B]): F[A],这样作用域里同时存在Applicative[F]和Functor[F],编译器就能找到map方法。 - 在
Applicativetrait里自行实现map,不需要依赖外部Functor:
这样只要有trait Applicative[F[_]: Functor]: def pure[A](a: A): F[A] extension[A, B] (fab: F[A => B]) def ap(fa: F[A]): F[B] // 通过pure和ap实现map,无需依赖外部Functor extension[A](fa: F[A]) def map[B](f: A => B): F[B] = pure(f).ap(fa)Applicative[F]实例,就能直接使用map,不需要额外添加Functor约束。
内容的提问来源于stack exchange,提问作者Robb
相关产品推荐
相关产品推荐

