Scala 无法恢复类型为F[A1,A2]且具有语法扩展名的类型的typeclass实例

Scala 无法恢复类型为F[A1,A2]且具有语法扩展名的类型的typeclass实例,scala,typeclass,ammonite,Scala,Typeclass,Ammonite,我一直在玩Scala中的typeclass模式,以便更好地理解它是如何工作的,因为我熟悉Scalaz,并且想弄清楚它是如何“在引擎盖下”工作的 (您可以使用REPL运行以下代码) import$plugin.$ivy.`org.spire math::kind projector:0.9.3` 可能[+A]//选项 最后一个案例类只是[+A](值:A)扩展了[A] 最后一个case对象Null扩展可能[无] 方向[+E,+A]//任一 最终案例类别向上[+E,+A](值:A)延伸方向[E,A]

我一直在玩Scala中的typeclass模式,以便更好地理解它是如何工作的,因为我熟悉Scalaz,并且想弄清楚它是如何“在引擎盖下”工作的

(您可以使用REPL运行以下代码)

import$plugin.$ivy.`org.spire math::kind projector:0.9.3`
可能[+A]//选项
最后一个案例类只是[+A](值:A)扩展了[A]
最后一个case对象Null扩展可能[无]
方向[+E,+A]//任一
最终案例类别向上[+E,+A](值:A)延伸方向[E,A]
最终案例类别向下[+E,+A](值:E)延伸方向[E,A]
特征函子[F[]]{
def映射[A,B](fa:F[A])(F:A=>B):F[B]
}
对象函数语法{
隐式final类FunctorExtensions[F[]A](private val self:F[A])扩展AnyVal{
定义映射[B](f:A=>B)(隐式实例:函子[f]):f[B]={
实例.map(self)(f)
}
}
}
对象函数{
隐式val maybeFunctorInstance:函子[Maybe]=新函子[Maybe]{
def-map[A,B](fa:Maybe[A])(f:A=>B):Maybe[B]=fa-match{
案例Just(a)=>Just(f(a))
案例n@Null=>n
}
}
隐式定义方向函子实例[E]:函子[方向[E,?]=新函子[方向[E,?]]{
def映射[A,B](fa:方向[E,A])(f:A=>B):方向[E,B]=fa匹配{
向上(a)=>向上(f(a))
外壳向下(e)=>向下(e)
}
}
}
因此,我编写了一些类似于
选项
可能
)和
任一
方向
)、
函子
定义、
函子
的一些实例、一些语法扩展,以便我可以对有效的函子调用
映射

以下代码起作用:

导入函数说明_
导入函数语法_
val x:可能[Int]=只有(5)
println(x.map(+1))//打印“Just(6)”
正如所料。但以下情况并非如此:

valy:Direction[String,Int]=Up(5)
println(y.map(+1))//输出错误
抛出错误
help.sc:48:值映射不是ammonite的成员。$file.help.Direction[String,Int]

简单地说,我不希望发生此错误,我希望
.map
在任意
方向[E,?]
上工作

我认为Scala无法看到
Direction[String,Int]
可以被分解成
F=Direction[String,?]
a=String
,从而阻止
FunctorExtensions
类围绕
val y:Direction[String,Int]
进行包装。不幸的是,我不知道如何解决这个问题

注意:实例本身仍然可以通过隐式的
恢复

val instance=隐式[函子[方向[字符串,?]]
println(instance.map(y)(+1))//打印“Up(6)”

如果您使用的是Scala 2.11或Scala 2.12,则可能缺少
-Ypartial unification
scalac选项

scalacOptions+=“-Ypartial unifications”
添加到您的构建中,或者您可以使用默认启用的Scala 2.13


请参见

这对我来说适用于以下设置:

Welcome to the Ammonite Repl 1.6.3
(Scala 2.12.8 Java 1.8.0_141)

interp.configureCompiler(uu.settings.YpartialUnification.value=true)
添加到文件顶部似乎无法解决此问题:(在ammonite上,您需要在脚本开始运行之前启用该标志。例如,在ammonite predef上。