【发布时间】:2017-02-02 04:57:06
【问题描述】:
我知道这有点棘手,但我想知道为什么它不起作用!
module Main where
sillyDebug :: Int -> Int -> Int
sillyDebug x y =
(print x) `seq` (x + y)
main :: IO ()
main = do
print (sillyDebug 1 2)
虽然它的理想是一样的
sillyDebug = (trace (show x) False) `seq` (x + y)
它与haskell中的惰性评估或副作用有关吗? https://hackhands.com/lazy-evaluation-works-haskell/
【问题讨论】:
-
请参阅stackoverflow.com/help/mcve。你的大部分进口都是无关紧要的,在这里。
sillyIO无处定义。sillyDebug = (trace (show x) False) `seq` (x + y)甚至无法编译。并描述您面临的问题。你期待什么?你得到了什么? -
对不起,这是我的错:3
-
这个问题是关于 evaluating 一个表达式和 executing 一个 monadic 动作之间的区别,但我认为关于 @987654328 也值得一提@。
a `seq` b并不完全强制评估a。它会在 thunk 之间生成依赖关系,因此 ifb被评估,那么a也被评估。print (snd (x `seq` y, z))从不评估x因为它从不评估y。
标签: debugging haskell io monads seq