2017-06-29 3 views
1

typelevelの猫(バージョン0.9.0)試しのためののFunctorインスタンスがscalaz(バージョン7.3.0-M12)ではありませんしながら、scala.util.Tryにcatsというインスタンスがありますが、scalazではインスタンスが存在しないのはなぜですか?

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

を試してみてくださいための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

ディスカッションhttps://github.com/typelevel/cats/pull/1059 – chenhry

答えて

1

Try 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

そのように見えます。視点の問題:Scalazのアプローチでは、ファンクタの法則を満たすことが分かっているので、ファンクタを使用すると、その動作を安全に理由付けることができます。例えば。一緒に物事を構成し、期待される結果を知ることができます。 Catsのアプローチでは、ファンクタの型クラスを必要とするTry in placesを使うことができますが、注意する必要があります。これは、実装を理解するために必要な問題を引き起こす可能性があります。 – Ren

関連する問題