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

我在Haskell做了一些练习,探索了一些我不熟悉的领域,但我无法理解混合
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
。这个例子肯定是误用了。使用一些