【发布时间】:2018-04-12 08:56:42
【问题描述】:
像something <- stuff 这样的语句是否总是在Haskell 中进行评估,即使在其余代码中没有调用something ? (something <- stuff 被称为“动作”吗?-我不知道技术措辞)。
如果这是真的,我还有一个问题。
我有一些这样开头的代码:
computeContour3d voxel voxmax level = do
voxelmax <- somefunction voxel
let max' = fromMaybe voxelmax voxmax
也就是说,如果参数voxmax 不是Nothing,那么voxelmax 是不必要的,因为在这种情况下max' = fromJust voxmax。因此,如果我的第一个问题的答案是“是”,我该如何避免在没有必要的情况下评估voxelmax?
【问题讨论】:
-
不是本身,这取决于使用的单子。事实上,例如,对于
Maybemonad,很可能会不评估大量数据。对于 I/O monad,可以保证 I/O actions 按照您指定的顺序完成。 -
@WillemVanOnsem
somefunction voxel返回一个IO (something) -
那么可以保证 I/O 操作按照您定义的顺序完成。但这本身并不意味着围绕这些 I/O 操作(在 Haskell 级别)发生的所有计算都已完成。
-
具体如果你在
IO,如果你想懒惰地执行一个动作,你可以使用unsafeInterleaveIO。不过这并不常见——将所有重要的东西从IO中推送到纯代码中被认为是更好的设计,这总是尽可能的懒惰。
标签: haskell monads lazy-evaluation evaluation operator-precedence