为什么scala.util.Try在cats中有一个实例,而在scalaz中没有?
typelevel的CAT(版本0.9.0)有一个用于Try的函子实例为什么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提供一个函子实例 另外,感谢任正非的评论。
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)