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)
看起来法律有效。我错过了什么吗?
答案 0 :(得分:1)
我相信这是因为Try打破了功能组成法则。在scalaz-outlaws下有一个实现(类型类的实例打破了各种类型的规则),这里是https://github.com/typelevel/scalaz-outlaws/blob/master/src/main/scala/scalaz/outlaws/std/Try.scala。