Haskell 如何将RTS选项传递给runghc?

Haskell 如何将RTS选项传递给runghc?,haskell,ghc,Haskell,Ghc,对于ghci,我可以限制ghci可以使用的内存 $ ghci +RTS -M10m -RTS 当我编译整个程序时,我可以 $ ghc -rtsopts a.hs 然后 如何为runghc a.hs执行此操作?我试过几种方法,比如runghc a.hs+RTS-M10m,但似乎都不管用。我唯一能限制内存的方法是 $ export GHCRTS='-M10m' $ runghc a.hs ,但我希望这只是一次,所以我更喜欢通过将参数传递给runghc 编辑:我正在使用以下策略检查选项是否有

对于
ghci
,我可以限制ghci可以使用的内存

$ ghci +RTS -M10m -RTS
当我编译整个程序时,我可以

$ ghc -rtsopts a.hs 
然后

如何为
runghc a.hs
执行此操作?我试过几种方法,比如
runghc a.hs+RTS-M10m
,但似乎都不管用。我唯一能限制内存的方法是

$ export GHCRTS='-M10m'
$ runghc a.hs
,但我希望这只是一次,所以我更喜欢通过将参数传递给
runghc


编辑:我正在使用以下策略检查选项是否有效(只是因为我不知道更好的方法):


打开两个终端,一个用于
top
命令,另一个用于执行代码。如果执行停止说“Heap expensed”,我就断定
-M[number]M
正在工作。如果执行继续并使用大量内存,我会终止进程,并得出结论认为它没有成功。

使用
GHCRTS=。。。runghc…
as said是唯一的方法。由于
runghc
解释其命令行的方式,
+RTS
被解释为
runghc
本身的RTS选项(如果在末尾)或程序名(如果在开头)。它永远不会到达运行时。您可以使用
--RTS+RTS…
强制将其传递给程序,但随后它会被视为程序参数,并且运行时仍然看不到它

为了研究这一点,我为
ghc
编写了一个跟踪其参数的包装shell脚本,并使用
-f
选项将其传递给
runghc

创建一个包含以下内容的文件
ghc包装

#/bin/sh-x
执行ghc“$@”
-x
选项告诉
/bin/sh
跟踪每一行。与
runghc一起使用此选项

$runghc-f./ghc wrapper Hello.hs
+exec ghc-ignore dot ghci-x hs-e:set prog“Hello.hs”-e:main[]Hello.hs
你好,世界!
$runghc-f./ghc包装Hello.hs+RTS-s
+exec ghc-ignore dot ghci-x hs-e:set prog“Hello.hs”-e:main[]Hello.hs
你好,世界!
在堆中分配的114016字节#runghc的堆,而不是Hello的堆
...
$runghc-f./ghc包装Hello.hs--RTS+RTS-s
+exec ghc-ignore dot ghci-x hs-e:set prog“Hello.hs”-e:main[“+RTS”,“-s”]Hello.hs
你好,世界!
$runghc-f./ghc包装器--+RTS-s-RTS Hello.hs
+exec ghc-忽略点ghci-e:设置程序“+RTS”-e:主[“-s”、“-RTS”、“Hello.hs”]+RTS
+RTS:1:55:
不在范围内:`main'
也许你的意思是“min”(从Prelude中导入)
我们真正希望
runghc
执行的是:

$ghc-ignore dot ghci-x hs+RTS-s-RTS-e':set prog“Hello.hs”'-e':main[]'Hello.hs
你好,世界!
在堆中分配的80654256字节
...

但是没有办法具体说明这一点,因为
runghc
没有特别处理
+RTS

runghc+RTS-M10m a.hs
runghc-rtsopts a.hs+RTS-M10m
?(只是猜测)@Dogbert两种方法都试过了,但都不奏效。无论如何,谢谢:(你是如何检查是否从程序中设置了标志的?@Dogbert我编辑了这个问题。谢谢。如果一切都失败了,bash允许通过在一行上使用
GHCRTS=“-M10m”runghc a.hs
设置变量“仅一次”。这不会为下一个bash命令设置变量。
$ export GHCRTS='-M10m'
$ runghc a.hs
-- a.hs
f x = f (f x)
main = print $ seq (f 0) 0