帮助Haskell动态插件加载

Rob N 18 plugins haskell dynamic-loading

我是Haskell的初学者,我正试图在'plugins'包中使用动态加载.我有点迷茫.这是一个包含两个文件的最小程序.

Main.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

我编译Plug with ghc -c Plug.hs产生Plug.o. 然后我用ghc -o Main Main.hs,编译Main.hs ,然后运行Main.我也尝试更换loaddynload,并与运行runhaskell.这四种组合中只有一种有效.我究竟做错了什么?

  • dynload
    • 编译→打印"已加载",然后seg故障
    • runhaskell→打印"正在加载",然后"Main.hs:Prelude.undefined"
  • load
    • 编译→成功,打印整数
    • runhaskell→打印"正在加载",挂起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案件.我为那些人提出了一个错误.