在 `first` 的严格版本中两次调用 `seq`
Two calls to `seq` in strict version of `first`
为什么在下面的代码中有两次调用 seq
(sourced from here) - 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` r
和 r
在语义上完全相同。
我确信这是一个错字。我想应该是
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)
状态的操作都保留不变的“必须始终评估两个组件”。
为什么在下面的代码中有两次调用 seq
(sourced from here) - 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` r
和 r
在语义上完全相同。
我确信这是一个错字。我想应该是
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)
状态的操作都保留不变的“必须始终评估两个组件”。