2017-06-29 58 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

相關問題