小编Jos*_*ine的帖子

Haskell:如何超时运行外部命令的函数

我在函数内部调用外部程序.现在我想超时这个功能而不仅仅是外部程序.但是在函数超时之后,外部程序仍然在我的计算机上运行(我正在使用debian),直到它完成计算,之后它的线程仍然作为主程序的子线程保留在进程表中直到主程序终止.

这里有两个最小的例子,说明了我想做的事情.第一个使用unsafePerformIO,第二个完全在IO monad中.我并不真的依赖于unsafePerformIO,但是如果可能的话我想保留它.所描述的问题在有和没有它的情况下发生.

使用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)

haskell timeout external-process

16
推荐指数
1
解决办法
1723
查看次数

Haskell:模块导入不必要的二进制增长

当我通过以下方式之一将(大)模块导入主模块时:

import Mymodule
import qualified Mymodule as M
import Mymodule (MyDatatype)
Run Code Online (Sandbox Code Playgroud)

与不导入该模块时相比,编译后的二进制文件增长量相同.无论我是否在主模块中使用该模块内的任何内容,都会发生这种情况.不应该编译器(我在Debian测试中使用GHC)只添加运行它所需的二进制文件吗?

在我的具体情况下,我在Mymodule中有一个巨大的Map,我没有在Main模块中使用它.有选择地导入我真正需要的东西,并没有改变编译二进制文件的增长.

haskell

8
推荐指数
1
解决办法
1128
查看次数

最有效的方法来创建Set中所有元素对的Data.Set?

给定任意集合,保持任意数量的任意类型的元素,例如

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)

performance haskell

5
推荐指数
1
解决办法
1428
查看次数

Haskell:runInteractiveCommand:如何忽略到目前为止给出的输出?

我通过"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

io haskell pipe process

1
推荐指数
1
解决办法
1023
查看次数

标签 统计

haskell ×4

external-process ×1

io ×1

performance ×1

pipe ×1

process ×1

timeout ×1