【问题标题】:why scala.util.Try has an instance in cats but not in scalaz?为什么 scala.util.Try 在猫中有一个实例,但在 scalaz 中没有?
【发布时间】:2017-06-29 04:24:04
【问题描述】:

typelevel 的猫(0.9.0 版)有一个用于 Try 的 Functor 实例

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 的 Functor 实例。

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

我想知道为什么 scalaz 不为 Try 提供 Functor 实例?

附:感谢 Ren 的 cmets。我在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)

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

【问题讨论】:

标签: scala try-catch functor scalaz


【解决方案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

【讨论】:

  • 看起来像。这是一个视角问题:使用 Scalaz 方法,如果你有一个函子,你可以安全地推断它的行为,因为你知道它满足函子定律。例如。您可以将事物组合在一起并知道预期的结果。使用 Cats 方法,您可以在需要仿函数类型类的地方使用 Try,但您需要更加小心 - 这可能会导致您需要了解实现才能了解的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
相关资源
最近更新 更多