评估"某事< - stuff"声明

时间:2018-04-12 08:56:43

标签: haskell monads lazy-evaluation evaluation operator-precedence

是否总是在Haskell中评估像something <- stuff这样的语句,即使在其余代码中没有调用something时也是如此? (something <- stuff被称为&#34;行动&#34;? - 我不知道技术措辞。)

如果这是真的,我还有另外一个问题。

我有一些代码从这样开始:

computeContour3d voxel voxmax level = do
    voxelmax <- somefunction voxel
    let max' = fromMaybe voxelmax voxmax

也就是说,如果参数voxmax不是Nothing,则不需要voxelmax,因为在这种情况下max' = fromJust voxmax。因此,如果我的第一个问题的答案是&#34;是&#34;,如果没有必要,我怎么能避免评估voxelmax

2 个答案:

答案 0 :(得分:5)

不,monadic绑定不能保证任何事情都得到评估。有懒惰的单子;例如除非somefunction voxelvoxmax,否则读者monad不会强制Nothing的结果。

但是没有理由依赖这种行为;很容易可靠地避免额外的计算:

computeContour3d voxel voxmax level = do
    max' <- case voxmax of
        Nothing -> somefunction voxel
        Just max -> return max
    -- use max'

您可以考虑使用maybe,它通常比明确的case短,如下所示:

    max' <- maybe (somefunction voxel) return voxmax

答案 1 :(得分:0)

  

类似于&lt; - stuff的语句是否总是在Haskell中进行评估,即使在其余代码中没有调用某些内容时也是如此?

不一般,没有。 IO monad强制进行此类评估,但许多其他人不这样做。

  

something <- stuff被称为&#34;动作&#34; ?

通常该行将被称为monadic bind 。一些单子(例如名单)并非真的&#34;行动&#34;以任何有意义的方式。