在“first”的严格版本中两次调用“seq”

Sal*_*Sal 5 haskell 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
Run Code Online (Sandbox Code Playgroud)

我认为一个调用可以seq使它变得严格。

Dan*_*ner 6

这是某种程度的错误。r `seq` r并且r在语义上完全相同。


chi*_*chi 5

我相当有信心这是一个错字。我想应该是

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

从而强制两个对分量。也许

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

假设第二个组件已经被评估,它会产生一个完全评估的对。这是明智的,例如,如果我们使用的所有作用于IORef (Int, Int)状态的操作都保持不变“必须始终评估两个组件”。