相关疑难解决方法(0)

为什么类型级计算需要Aux技术?

我很确定我在这里遗漏了一些东西,因为我对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)

types scala type-level-computation shapeless

42
推荐指数
1
解决办法
1380
查看次数

使用Context Bound时无法找到隐含值

我正在使用以下用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 implicit context-bound

5
推荐指数
1
解决办法
251
查看次数

Scala更高的kinded类型方差

我正在用更高级的类型浸泡我的脚趾,探索一个非常基本的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)

scala higher-kinded-types

5
推荐指数
1
解决办法
367
查看次数