【发布时间】:2019-08-03 16:04:21
【问题描述】:
标准 Haskell 被延迟评估,所以如果 myCondition 为真,if myCondition then someValue else doSomeLargeComputation x y z 将避免评估 doSomeLargeComputation x y z。我的问题是,如果我启用语言扩展 XStrict,那么即使 myCondition 为真,doSomeLargeComputation x y z 现在也会被评估?
如果是这样,除了将 doSomeLargeComputation x y z 显式标记为惰性之外,是否还有其他控制流构造可用于避免计算它(如严格语言中的短路 if 语句)?
【问题讨论】:
-
if在我所知道的任何语言中都是非严格的——这在不纯的语言中更为重要,因为您不想观察两个分支的副作用。在具有严格if的(疯狂的,IMO)高阶语言中,我们仍然可以编写(if cond then (\_-> doX) else (\_-> doY)) ()来强制它变得懒惰,但是需要经常使用这种hack,它应该是默认值。跨度>
标签: haskell