在"first"的严格版本中对"seq"的两个调用



为什么下面的代码中有两个对seq的调用(来源于此处(-r被传递了两次:

first' :: (a -> b) -> (a, c) -> (b, c)
first' f (x,y) = let { x' = f x; r = (x', y) } 
in x' `seq` r `seq` r

我认为,对seq的一次调用就可以使其变得严格。

这在某种程度上是一个错误。r `seq` rr在语义上完全相同。

我确信这是一个拼写错误。我想应该是

first' :: (a -> b) -> (a, c) -> (b, c)
first' f (x,y) = let { x' = f x; r = (x', y) } 
in x' `seq` y `seq` r

使得两个成对部件都被强制。或者

first' :: (a -> b) -> (a, c) -> (b, c)
first' f (x,y) = let { x' = f x; r = (x', y) } 
in x' `seq` r

这产生了一个完全评估的对,假设第二个组件已经被评估。例如,如果我们使用的所有作用于IORef (Int, Int)状态的操作都保持不变";两个组成部分必须总是被评估";。

相关内容

  • 没有找到相关文章

最新更新