评估 "something <- stuff" 个语句

Evaluation of "something <- stuff" statements

something <- stuff 这样的语句是否总是在 Haskell 中求值,即使在其余代码中未调用 something 也是如此? (something <- stuff 称为 "action" 吗?- 我不知道技术用语)。

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

我有一些代码是这样开始的:

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

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

不,单子绑定不能保证任何东西都被评估。有懒惰的单子;例如reader monad 不会强制 somefunction voxel 的结果,除非 voxmaxNothing.

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

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

Is it true that statements like something <- stuff are always evaluated in Haskell, even when something is not called in the rest of the code ?

一般不会,不会。 IO monad 强制进行这样的评估,但许多其他 monad 不会。

is something <- stuff called an "action" ?

通常该行会被称为 monadic bind。一些单子(例如列表)并没有真正 "act" 以任何有意义的方式。