为什么scala.util.Try在cat中有一个实例但在scalaz中没有?

时间:2017-06-29 04:24:05

标签: scala try-catch functor scalaz

typelevel的猫(版本0.9.0)有一个Tryctor的Functor实例

object catsTry {
  import cats.Functor
  import cats.instances.try_._
  import scala.util.Try
  val f = implicitly[Functor[Try]] //compile
}

虽然在scalaz(版本7.3.0-M12)中没有Functor实例。

object scalazTry {
  import scalaz._
  import Scalaz._
  import scala.util.Try
  val f = implicitly[Functor[Try]] // won't compile
}

我想知道为什么scalaz没有为Try提供Functor实例?

P.S。感谢Ren的评论。我在https://issues.scala-lang.org/browse/SI-6284

上尝试了这个案例
@ Success(1) map { ((i:Int)=>numberOrDefault(i)) compose divideByZero } 
res3: Try[Int] = Failure(java.lang.ArithmeticException: / by zero)

@ Success(1) map divideByZero map ((i:Int)=>numberOrDefault(i)) 
res4: Try[Int] = Failure(java.lang.ArithmeticException: / by zero)
看起来法律有效。我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

我相信这是因为Try打破了功能组成法则。在scalaz-outlaws下有一个实现(类型类的实例打破了各种类型的规则),这里是https://github.com/typelevel/scalaz-outlaws/blob/master/src/main/scala/scalaz/outlaws/std/Try.scala

请参阅https://issues.scala-lang.org/browse/SI-6284