Haskell 超时和不安全性能
我在Haskell做了一些练习,探索了一些我不熟悉的领域,但我无法理解混合Haskell 超时和不安全性能,haskell,timeout,lazy-evaluation,unsafe-perform-io,Haskell,Timeout,Lazy Evaluation,Unsafe Perform Io,我在Haskell做了一些练习,探索了一些我不熟悉的领域,但我无法理解混合System.Timeout和System.IO.safe时的行为 我懒洋洋地阅读一个流,用getContents,用纯函数过滤它,然后输出结果。典型的过滤器如下所示: import Data.List(break) import System.Timeout(timeout) import System.IO.Unsafe(unsafePerformIO) main = do text <- getCon
System.Timeout
和System.IO.safe
时的行为
我懒洋洋地阅读一个流,用getContents
,用纯函数过滤它,然后输出结果。典型的过滤器如下所示:
import Data.List(break)
import System.Timeout(timeout)
import System.IO.Unsafe(unsafePerformIO)
main = do
text <- getContents
putStr $ aFilter text
aFilter text = h ++ t where
(h, t) = getUntil "\n" text
getUntil separator text = break (\x -> (separator!!0) == x) text
我希望我的程序立即超时,打印“timeout!”消息,然后关闭。相反,它挂在那里,等待输入
我认为timeout
函数是在程序启动时评估的,这是不是错了?我希望是这样,因为我会立即将其返回值的一部分写入stdout,并且软件会在每次我输入一行时做出反应。unsafePerformIO
是否在我的函数中插入了某种懒散?还是将懒散插入系统的内部。超时?
timeout 6 $! return $! (x, y)
在正常工作负载下从不触发超时。上述代码不强制计算x
和y
。也许在这里使用评估会有所帮助
此外,使用unsafePerformIO
执行此任务看起来有些过分。使用unsafePerformIO
只能作为最后手段。我希望
timeout 6 $! return $! (x, y)
在正常工作负载下从不触发超时。上述代码不强制计算x
和y
。也许在这里使用评估会有所帮助
此外,使用unsafePerformIO
执行此任务看起来有些过分。使用unsafePerformIO
只能作为最后手段。我希望
timeout 6 $! return $! (x, y)
在正常工作负载下从不触发超时。上述代码不强制计算x
和y
。也许在这里使用评估会有所帮助
此外,使用unsafePerformIO
执行此任务看起来有些过分。使用unsafePerformIO
只能作为最后手段。我希望
timeout 6 $! return $! (x, y)
在正常工作负载下从不触发超时。上述代码不强制计算x
和y
。也许在这里使用评估会有所帮助
此外,使用unsafePerformIO
执行此任务看起来有些过分。使用unsafePerformIO
只能作为最后手段。原因是返回$!(x,y)
没有严格评估x
或y
。它只计算元组构造函数,元组构造函数不一定计算其字段x
和y
因此,在您的程序中发生的是return$!(x,y)
立即成功,而不实际尝试计算x
和y
。然后h++t
部分开始计算h
,这是它最终开始阻止输入的时候
顺便说一句,这就是你不应该使用unsafePerformIO的原因:你不能很容易地推断出影响实际发生的时间。原因是返回$!(x,y)
没有严格评估x
或y
。它只计算元组构造函数,元组构造函数不一定计算其字段x
和y
因此,在您的程序中发生的是return$!(x,y)
立即成功,而不实际尝试计算x
和y
。然后h++t
部分开始计算h
,这是它最终开始阻止输入的时候
顺便说一句,这就是你不应该使用unsafePerformIO的原因:你不能很容易地推断出影响实际发生的时间。原因是返回$!(x,y)
没有严格评估x
或y
。它只计算元组构造函数,元组构造函数不一定计算其字段x
和y
因此,在您的程序中发生的是return$!(x,y)
立即成功,而不实际尝试计算x
和y
。然后h++t
部分开始计算h
,这是它最终开始阻止输入的时候
顺便说一句,这就是你不应该使用unsafePerformIO的原因:你不能很容易地推断出影响实际发生的时间。原因是返回$!(x,y)
没有严格评估x
或y
。它只计算元组构造函数,元组构造函数不一定计算其字段x
和y
因此,在您的程序中发生的是return$!(x,y)
立即成功,而不实际尝试计算x
和y
。然后h++t
部分开始计算h
,这是它最终开始阻止输入的时候
顺便说一句,这就是你不应该使用unsafePerformIO
的原因:你不能轻易地推断出影响实际发生的时间。1)如果你必须询问unsafePerformIO
,那么你就不应该使用unsafePerformIO
。这个例子肯定是误用了。使用类似于勺子的工具
库。2) 此代码不可编译。在以后的问题中,请发布您实际使用的代码。1)但是如果我不在陌生的地方尝试unsafePerformIO,我就无法真正理解Haskell的评估规则。2) 很抱歉没有编译,我完成了代码并更正了错误。我尝试了几种不同的方法,并删除了一个用于发布的代码片段。它不会改变结果。1)如果必须询问unsafePerformIO
,则不应使用unsafePerformIO
。这个例子肯定是误用了。使用一些