你会写seq x x吗?

时间:2014-05-09 17:24:00

标签: haskell lazy-evaluation

我并不完全清楚seq在Haskell中是如何工作的。

似乎有很多情况下编写

会很有用
seq x x

甚至可能定义一个函数:

strict x = seq x x

但是这样的功能还没有存在,所以我猜测这种方法在某种程度上是错误的。有人能告诉我这是否有意义或有用吗?

5 个答案:

答案 0 :(得分:18)

seq a b会返回b的值,但会使该值取决于a的评估。因此,seq a aa完全相同。

我认为这里的误解是seq没有采取任何行动,因为纯粹的功能不采取行动,只是引入了依赖。

evaluate :: a -> IO ()中有一个功能Control.Exception可以执行您想要的功能(请注意它在IO中)。他们把它放在异常中,因为查看表达式的评估是否会抛出是有用的,如果是,则处理异常。

答案 1 :(得分:8)

表达式x = seq a b表示如果 x被评估,那么a也将被评估(但x将等于{ {1}})。

意味着“现在评估b。”

请注意,如果正在评估a,那么由于x等于x,那么b也会被评估。

因此,如果我写b,我会说“如果评估x = seq a a,则评估x”。但是,如果我只做a,那将实现完全相同的事情

答案 2 :(得分:5)

seq x x将是完全的,非常多余的。

请记住,seq 不是命令。您的计划中存在seq a b并不会强制评估ab它做了什么,是否会使结果的评估人为地依赖于{{1}的评估},即使结果本身是a如果您打印出b,将会评估seq a b并丢弃其结果。由于a已经依赖于自身,{ {1}}很傻。

答案 3 :(得分:5)

当您说seq a b您告诉计算机的内容时,

  

每当您需要评估b时,请为我评估a

如果我们将ab替换为x,您就会明白为什么编写seq x x无效:

  

每当您需要评估x时,请为我评估x

要求计算机评估x何时需要评估x只是一件无用的事情 - 它无论如何都会评估x

seq 评估任何内容 - 它只是告诉计算机何时你需要第二个参数,还要评估第一个参数。理解这一点实际上非常重要,因为它可以让您更好地理解程序的行为。

答案 4 :(得分:1)

关闭! deepseq(“更全面”seq - 请参阅文档以获取完整说明)的类型为NFData a => a -> b -> bforce(类型为NFData a => a -> a })简单地定义为

force :: (NFData a) => a -> a
force x = x `deepseq` x