2017-06-29 28 views
1

typelevel的猫(0.9.0版本)的函子实例尝试为什么scala.util.Try在猫中有一个实例但不在scalaz中?

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

虽然对在scalaz尝试(版本7.3.0-M12)无函子实例。

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

我想知道为什么scalaz没有提供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

讨论https://github.com/typelevel/cats/pull/1059 – chenhry

回答

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

+0

感谢。那么猫不关心法律? – chenhry

+0

看起来像。它的观点:用斯卡拉斯方法,如果你有一个函子,你可以安全地推理它的行为,因为你知道它符合函数法则。例如。你可以把所有东西组合在一起,并且知道预期的结果。 使用Cat方法,您可以在需要函子类型类的地方使用Try,但需要更加小心 - 这可能会导致需要了解要了解的实现的问题。 – Ren

相关问题