评估 "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
的结果,除非 voxmax
是 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
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" 以任何有意义的方式。
像 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
的结果,除非 voxmax
是 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
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" 以任何有意义的方式。