假设:
$cat build.sbt
scalaVersion := "2.11.8"
libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.2.5"
libraryDependencies += "org.scalaz" %% "scalaz-concurrent" % "7.2.5"
scala> import scalaz.concurrent.Task
import scalaz.concurrent.Task
scala> def f(num: BigDecimal, denom: BigDecimal): Task[BigDecimal] =
Task { num / denom }
f: (num: BigDecimal, denom: BigDecimal)scalaz.concurrent.Task[BigDecimal]
scala> def g(num: BigDecimal, denom: BigDecimal): Task[BigDecimal] =
Task.now { num / denom }
g: (num: BigDecimal, denom: BigDecimal)scalaz.concurrent.Task[BigDecimal]
然后我使用f
的{{1}}来调用g
和0
:
denom
公平地说scala> f(1, 0)
res0: scalaz.concurrent.Task[BigDecimal] = scalaz.concurrent.Task@208b1305
scala> g(1, 0)
java.lang.ArithmeticException: Division by zero
at java.math.BigDecimal.divide(BigDecimal.java:1742)
at scala.math.BigDecimal.$div(BigDecimal.scala:571)
at .g(<console>:12)
... 42 elided
是一个完整的函数,而f
是否是部分的?
答案 0 :(得分:2)
Task.now
评估其论点,Task.apply
没有。因此,您甚至不会在第二种情况下测试您的假设,这就是您没有看到异常的原因。通过unsafePerformSync
运行它们,以便在Task
构建的apply
内运行代码。