我很确定我在这里遗漏了一些东西,因为我对Shapeless很新,而且我正在学习,但是Aux技术何时需要呢?我看到它用于通过将type语句提升到另一个"伴侣" type定义的签名来公开语句.
trait F[A] { type R; def value: R }
object F { type Aux[A,RR] = F[A] { type R = RR } }
Run Code Online (Sandbox Code Playgroud)
但是这不等于将R放入F的类型签名中吗?
trait F[A,R] { def value: R }
implicit def fint = new F[Int,Long] { val value = 1L }
implicit def ffloat = new F[Float,Double] { val value = 2.0D }
def f[T,R](t:T)(implicit f: F[T,R]): R = f.value
f(100) // res4: Long = 1L
f(100.0f) // res5: Double = …Run Code Online (Sandbox Code Playgroud) 我正在使用以下用Scala 2.11.8编写的代码:
sealed trait Acceptable[T]
object Acceptable {
implicit object Int extends Acceptable[Int]
implicit object String extends Acceptable[String]
}
case class Enc[T](f: T => Any)
implicit def test[I, T](implicit f: I => T, a: Acceptable[T]): Enc[I] =
Enc[I](f)
val e = implicitly[Enc[Int]]
Run Code Online (Sandbox Code Playgroud)
它成功编译.
如您所见,a: Acceptable[T]参数应该很容易转换为上下文绑定:
implicit def test[I, T: Acceptable](implicit f: I => T): Enc[I] =
Enc[I](f)
Run Code Online (Sandbox Code Playgroud)
但在那之后,更改编译开始失败并出现错误:
找不到参数e的隐含值:app.Enc [Int]
为什么会这样?
更新:
我试过-Xlog-implicits编译选项和编译日志给我:
[info] /path/to/ScalaTest/src/main/scala/app/Main.scala:60: test is not a valid implicit value for app.Enc[Int] …Run Code Online (Sandbox Code Playgroud) 我正在用更高级的类型浸泡我的脚趾,探索一个非常基本的Scala示例:
trait Mappable[F[_]] {
def map[A, B](fa: F[A])(f: A => B): F[B]
}
object Mappable {
implicit object MappableOption extends Mappable[Option] {
def map[A, B](fa: Option[A])(f: A => B): Option[B] = fa.map(f)
}
implicit object MappableSeq extends Mappable[Seq] {
def map[A, B](fa: Seq[A])(f: A => B): Seq[B] = fa.map(f)
}
}
def bananaTuple[F[_], T](f: F[T])(implicit F: Mappable[F]): F[(String, T)] =
F.map(f)(("banana", _))
Run Code Online (Sandbox Code Playgroud)
这有效:
bananaTuple(Option(42)) // Some((banana,42))
bananaTuple(Seq(42)) // List((banana,42))
Run Code Online (Sandbox Code Playgroud)
但这不编译:
bananaTuple(Some(42))
bananaTuple(List(42))
Run Code Online (Sandbox Code Playgroud)
我得到的编译错误:
could not find implicit value for parameter …Run Code Online (Sandbox Code Playgroud)