Помощь с динамической загрузкой плагинов Haskell

Я новичок в 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 с помощью ghc -c Plug.hs , который создает Plug.o. Затем я компилирую Main.hs с помощью ghc -o Main Main.hs и запускаю Main. Я также пытаюсь заменить load на dynload и запустить с runhaskell . Только одна из этих четырех комбинаций работает. Что я делаю не так?

  • с dynload
    • compiled → выводит "Loaded", затем seg faults
    • runhaskell → выводит "Loading", затем "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 . Я зарегистрировал ошибку для них.

18
задан Rob N 30 March 2011 в 16:52
поделиться