为什么scala.util.Try在cats中有一个实例,而在scalaz中没有?

为什么scala.util.Try在cats中有一个实例,而在scalaz中没有?,scala,try-catch,functor,scalaz,Scala,Try Catch,Functor,Scalaz,typelevel的CAT(版本0.9.0)有一个用于Try的函子实例 object catsTry { import cats.Functor import cats.instances.try_._ import scala.util.Try val f = implicitly[Functor[Try]] //compile } 而在scalaz(版本7.3.0-M12)中没有Try的函子实例 我想知道scalaz为什么不为Try提供一个函子实例 另外,感谢任正非的评论。

typelevel的CAT(版本0.9.0)有一个用于Try的函子实例

object catsTry {
  import cats.Functor
  import cats.instances.try_._
  import scala.util.Try
  val f = implicitly[Functor[Try]] //compile
}
而在scalaz(版本7.3.0-M12)中没有Try的函子实例

我想知道scalaz为什么不为Try提供一个函子实例

另外,感谢任正非的评论。我试过这个案子


看起来法律是成立的。我错过什么了吗

我相信这是因为Try打破了函数组合定律。scalaz Unlaws(违反各种类型类法则的类型类实例)下有一个实现,这里-


看起来像这样。这是一个透视问题:使用Scalaz方法,如果你有一个函子,你可以安全地对它的行为进行推理,因为你知道它满足函子定律。你可以把事情组合在一起,知道预期的结果。使用Cats方法,您可以在需要functor typeclass的地方使用Try,但您需要更加小心-这可能会导致您需要了解实现的问题。讨论
object scalazTry {
  import scalaz._
  import Scalaz._
  import scala.util.Try
  val f = implicitly[Functor[Try]] // won't compile
}
@ 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)