是否总是在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
?
答案 0 :(得分:5)
不,monadic绑定不能保证任何事情都得到评估。有懒惰的单子;例如除非somefunction voxel
为voxmax
,否则读者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;以任何有意义的方式。