Task.apply与Task.now wrt函数Totality

时间:2016-11-14 16:31:44

标签: scala scalaz

假设:

$cat build.sbt
scalaVersion := "2.11.8"

libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.2.5"
libraryDependencies += "org.scalaz" %% "scalaz-concurrent" % "7.2.5"

REPL

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}}来调用g0

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是否是部分的?

1 个答案:

答案 0 :(得分:2)

Task.now评估其论点,Task.apply没有。因此,您甚至不会在第二种情况下测试您的假设,这就是您没有看到异常的原因。通过unsafePerformSync运行它们,以便在Task构建的apply内运行代码。