【发布时间】:2020-09-12 03:19:59
【问题描述】:
我正在尝试在 Scala 中实现 Absurd typeclass (as seen in Haskell's Data.Boring library)。
我可以为Nothing 定义一个Absurd 实例。
不幸的是,当我尝试为 Either 定义一个荒谬的实例时,我得到一个缺少的隐式错误
sealed trait Absurd[A] {
def absurd[X](a: A): X
}
object Absurd {
def apply[A: Absurd, B](a: A):B = implicitly[Absurd[A]].absurd[B](a)
implicit val absurdForNothing: Absurd[Nothing] = new Absurd[Nothing]{
override def absurd[X](a: Nothing): X = a
}
implicit def absurdForEither[A: Absurd, B: Absurd]: Absurd[Either[A, B]] = new Absurd[Either[A, B]]{
override def absurd[X](a: Either[A,B]): X = a match {
case Left(a) => Absurd[A, X](a)
case Right(b) => Absurd[B, X](b)
}
}
}
这样编译:
implicitly[Absurd[Nothing]]
编译失败:
implicitly[Absurd[Either[Nothing, Nothing]]]
我正在使用 Scala 版本“2.13.2”。
值得注意的是,以下非常相似的代码(不涉及Nothing)确实可以编译:
trait SomeTypeclass[A]
case class SomeInstance()
object SomeTypeclass {
implicit val someTypeclassForSomeInstance: SomeTypeclass[SomeInstance] = new SomeTypeclass[SomeInstance] {}
implicit def someTypeclassForEither[A: SomeTypeclass, B: SomeTypeclass]: SomeTypeclass[Either[A, B]] = new SomeTypeclass[Either[A, B]] {}
}
object SomeApplicationCode {
implicitly[SomeTypeclass[Either[SomeInstance, SomeInstance]]]
}
【问题讨论】:
-
stackoverflow.com/questions/61951621/… stackoverflow.com/questions/15310451/…(以及 scala bug tracker 的问题链接)
-
顺便说一句,在 Dotty 中代码编译 scastie.scala-lang.org/C8o3hD50RSKYYrBghbgdKw
-
感谢您的链接,这些帮助我找到了this post,我认为这是我的首选工作
-
我将把这个写下来作为完整性的答案
标签: scala typeclass implicit bottom-type