Подтвердить что ты не робот

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

  • с dynload
    • compiled → печатает "Loaded", затем seg faults
    • runhaskell → печатает "Загрузка", затем "Main.hs: Prelude.undefined"
  • с load
    • compiled → успешно, печатает Integer
    • runhaskell → печатает "Загрузка", зависает в течение 5-10 секунд, исчезает

Я нахожусь в Mac OS X. GHC версии 7.0.2. Что я делаю неправильно?

спасибо,
Rob

Update

Я могу исправить скомпилированный dynload, изменив Plug.hs на следующее...

module Plug (thing) where
import Data.Dynamic                                                                                                    
thing :: Dynamic
thing = toDyn (1234000::Integer)

Было бы неплохо, если бы не ошибка при ошибке. Я думаю, у него не хватает метаданных в Plug.o для проверки типа. Во всяком случае, это оставляет случаи runhaskell. Я отправил ошибку для них.

4b9b3361

Ответ 1

Я пробовал ваш пример в Ubuntu 10.10 с GHC 6.12.1, и результаты: обе dynload и load с запуском обоих выполняемых или через runhaskell дают мне ошибку "Prelude.undefined", поэтому я подумайте, что вы должны сообщить об ошибке разработчикам.

Я не вижу особых случаев и условий в их документации haddock, поэтому я не думаю, что вы делаете что-то неправильно.