我并不完全清楚seq在Haskell中是如何工作的。
似乎有很多情况下编写
会很有用seq x x
甚至可能定义一个函数:
strict x = seq x x
但是这样的功能还没有存在,所以我猜测这种方法在某种程度上是错误的。有人能告诉我这是否有意义或有用吗?
答案 0 :(得分:18)
seq a b
会返回b
的值,但会使该值取决于a
的评估。因此,seq a a
与a
完全相同。
我认为这里的误解是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
并不会强制评估a
或b
它做了什么,是否会使结果的评估人为地依赖于{{1}的评估},即使结果本身是a
如果您打印出b
,将会评估seq a b
并丢弃其结果。由于a
已经依赖于自身,{ {1}}很傻。
答案 3 :(得分:5)
当您说seq a b
您告诉计算机的内容时,
每当您需要评估
b
时,请为我评估a
。
如果我们将a
和b
替换为x
,您就会明白为什么编写seq x x
无效:
每当您需要评估
x
时,请为我评估x
。
要求计算机评估x
何时需要评估x
只是一件无用的事情 - 它无论如何都会评估x
!
seq
不评估任何内容 - 它只是告诉计算机何时你需要第二个参数,还要评估第一个参数。理解这一点实际上非常重要,因为它可以让您更好地理解程序的行为。
答案 4 :(得分:1)