【问题标题】:In Haskell, when using the XStrict language extension, is if short-circuiting?在 Haskell 中,当使用 XStrict 语言扩展时,是否会短路?
【发布时间】: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


【解决方案1】:

不,不评估未采用的分支。

例如:

{-# LANGUAGE Strict #-}
import Debug.Trace

main :: IO ()
main = print (f (fib 3))

f i =
    if i < 5
        then trace "then" 0
        else trace "else" 1

-- Using fib to avoid inlining or optimization from messing up or test.
fib :: Int -> Int
fib 1 = 1
fib n  = n + fib (n-1)

打印:

*Main> main
else
1

但是,如果我们提升分支以让绑定,那么是的,它们会被严格评估:

f :: Int -> Int
f i =
    let f1 = trace "then" 1 in
    let f2 = trace "else" 2 in
    if i < 5
        then f1
        else f2

产量:

% ./LogicChains
then
else
2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多