gpt4 book ai didi

haskell - 切断懒惰的列表生成

转载 作者:行者123 更新时间:2023-12-03 14:38:54 24 4
gpt4 key购买 nike

我想知道是否有人对如何创建一个函数有任何见解,该函数将接受一个列表并且只返回可以在 x 时间内生成的术语。

例如,我有一个函数需要大约 10 分钟才能返回几个术语。与其猜测我能够生成多少项(使用 x ),我只想将一个无限列表输入到我的低效函数中,并让一个单独的函数决定何时超时。

所以像这样:[5,7,10] = takeUntilTime (10 sec) . inefficientFunction $ [1..]
我对 haskell 很陌生,但我想我可以编写该函数来在每个新术语生成后检查计时器,并在时间已过时停止。

但是,如果第 4 个任期是永恒的呢?有没有办法阻止 inefficientFunction 完成第 4 项的生成,即使它已经开始?

我对一个直截了当的答案没有寄予厚望,但我很感激对此的任何直觉。谢谢。

最佳答案

尚未对其进行过多测试,但这似乎有效,至少在小范围内是有效的。

import Control.Concurrent
import Control.Exception
import Control.Monad

takeUntilTime :: Int -> [a] -> IO [a]
takeUntilTime limit list = do
me <- myThreadId
bracket (forkIO $ threadDelay limit >> throwTo me NonTermination) killThread
. const $ tryTake list
where
(/:/) = liftM2 (:)
tryTake list = handle (\NonTermination -> return []) $
case list of
[] -> return []
x:xs -> evaluate x /:/ tryTake xs

ghci> takeUntilTime 1000000 [x | x <- [1..], x == 0]
[]
(1.02 秒,153111264 字节)
ghci> takeUntilTime 1000000 [最大值 [y `mod` x | y <- [1..100000]] | x <- [1..]]
[0,1,2,3]
(1.00 秒,186234264 字节)

关于haskell - 切断懒惰的列表生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4964380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com