我在函数内部调用外部程序.现在我想超时这个功能而不仅仅是外部程序.但是在函数超时之后,外部程序仍然在我的计算机上运行(我正在使用debian),直到它完成计算,之后它的线程仍然作为主程序的子线程保留在进程表中直到主程序终止.
这里有两个最小的例子,说明了我想做的事情.第一个使用unsafePerformIO,第二个完全在IO monad中.我并不真的依赖于unsafePerformIO,但是如果可能的话我想保留它.所描述的问题在有和没有它的情况下发生.
module Main where
import System.Timeout
import Criterion.Measurement
import System.IO.Unsafe
import System.Process
main = do
x <- time $ timeoutP (1 * 1000000) $ mytest 2
y <- getLine
putStrLn $ show x ++ y
timeoutP :: Int -> a -> IO (Maybe a)
timeoutP t fun = timeout t $ return $! fun
mytest :: Int -> String
mytest n =
let
x = runOnExternalProgram $ n * 1000
in
x ++ ". Indeed."
runOnExternalProgram :: …Run Code Online (Sandbox Code Playgroud) 当我通过以下方式之一将(大)模块导入主模块时:
import Mymodule
import qualified Mymodule as M
import Mymodule (MyDatatype)
Run Code Online (Sandbox Code Playgroud)
与不导入该模块时相比,编译后的二进制文件增长量相同.无论我是否在主模块中使用该模块内的任何内容,都会发生这种情况.不应该编译器(我在Debian测试中使用GHC)只添加运行它所需的二进制文件吗?
在我的具体情况下,我在Mymodule中有一个巨大的Map,我没有在Main模块中使用它.有选择地导入我真正需要的东西,并没有改变编译二进制文件的增长.
给定任意集合,保持任意数量的任意类型的元素,例如
mySet1 = Set.fromList [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
要么
mySet2 = Set.fromList ["a","b","c","d"]
Run Code Online (Sandbox Code Playgroud)
要么
mySet3 = Set.fromList [A, B, C, D]
Run Code Online (Sandbox Code Playgroud)
对于一些数据构造函数A,B,C,D,...
生成所有无序元素对的计算最有效方法是给定集合?即
setPairs mySet1 == Set.fromList [(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]
Run Code Online (Sandbox Code Playgroud)
要么
setPairs mySet2 == fromList [ ("a","b")
, ("a","c")
, ("a","d")
, ("b","c")
, ("b","d")
, ("c","d") ]
Run Code Online (Sandbox Code Playgroud)
要么
setPairs mySet2 == fromList [ (A,B)
, (A,C)
, (A,D)
, (B,C)
, (B,D)
, (C,D) ]
Run Code Online (Sandbox Code Playgroud)
我最初的天真猜测是:
setPairs s = fst $ Set.fold
(\e (pairAcc, elementsLeft) ->
( Set.fold
(\e2 pairAcc2 ->
Set.insert (e2, e) …Run Code Online (Sandbox Code Playgroud) 我通过"runInteractiveCommand"在haskell中运行一个外部交互程序,并希望读取程序的输出,直到它显示程序提示.到目前为止我有
checkConsistency cal nets = do
(sparqIn, sparqOut, sparqErr, sparqId) <- runInteractiveCommand "sparq -i"
mapM_ (flip hSetBinaryMode False) [sparqIn, sparqOut]
hSetBuffering sparqIn LineBuffering
hSetBuffering sparqOut NoBuffering
hPutStrLn sparqIn ("load-calculus " ++ cal)
-- Here i need to wait for output and ignore it until the prompt is shown!
sparqAnswers <- mapM (checkConsistencyWithSparq sparqIn sparqOut) nets
return sparqAnswers
Run Code Online (Sandbox Code Playgroud)
我想我应该在while循环中使用"hReady"和"hGetChar",但我不确定如何完成它.或者也许有更好的方法?
亲切的问候,Annaluise