我是 Haskell 初学者,我正在尝试使用“插件”包中的动态加载。我有点迷路了。这是一个包含两个文件的最小程序。
主要.hs:
module Main (main) where
import System.Plugins
main :: IO ()
main = do
putStrLn "Loading"
mv <- dynload "Plug.o" [] [] "thing" -- also try 'load' here
putStrLn "Loaded"
case mv of
LoadFailure msgs -> putStrLn "fail" >> print msgs
LoadSuccess _ v -> putStrLn "success" >> print (v::Integer)
和 Plug.hs:
module Plug (thing) where
thing :: Integer
thing = 1234000
我编译 Plugghc -c Plug.hs
产生 Plug.o。然后我用 编译 Main.hsghc -o Main Main.hs
并运行 Main。我也尝试用 替换load
,dynload
并用runhaskell
. 这四种组合中只有一种有效。我究竟做错了什么?
- 和
dynload
- 编译→打印“加载”,然后是段错误
- runhaskell → 打印“Loading”,然后打印“Main.hs: Prelude.undefined”
- 和
load
- 编译→成功,打印整数
- runhaskell → 打印“Loading”,挂起 5-10 秒,消失
我在 Mac OS X 上。GHC 版本 7.0.2。我究竟做错了什么?
谢谢,
罗伯
更新
我可以dynload
通过将 Plug.hs 更改为以下内容来修复编译...
module Plug (thing) where
import Data.Dynamic
thing :: Dynamic
thing = toDyn (1234000::Integer)
如果它没有在错误时出现故障,那就太好了。我猜它在 Plug.o 中没有足够的元数据来检查类型。无论如何,这留下了runhaskell
案例。我为那些提交了一个错误。