gpt4 book ai didi

api - Haskell GHC API 中的动态编译错误

转载 作者:行者123 更新时间:2023-12-04 11:41:06 25 4
gpt4 key购买 nike

我一直在尝试按照找到的教程 here 使用 GHC API 进行一些基本的动态代码编译。 .

这段代码:

import GHC
import GHC.Paths
import DynFlags
import Unsafe.Coerce

main :: IO ()
main =
defaultErrorHandler defaultDynFlags $ do
func <- runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
target <- guessTarget "Test.hs" Nothing
addTarget target
r <- load LoadAllTargets
case r of
Failed -> error "Compilation failed"
Succeeded -> do
m <- findModule (mkModuleName "Test") Nothing
setContext [] [m]
value <- compileExpr ("Test.print")
do let value' = (unsafeCoerce value) :: String -> IO ()
return value'
func "Hello"
return ()

应该从另一个名为 Test.hs 的文件中获取打印功能,加载它并运行它的打印功能。

我使用 ghc 版本 7.4.1 使用以下命令编译代码:
ghc -package ghc --make Api.hs

但收到以下错误:
Api.hs:8:25:
Couldn't match expected type `Severity' with actual type `Settings'
Expected type: LogAction
Actual type: Settings -> DynFlags
In the first argument of `defaultErrorHandler', namely
`defaultDynFlags'
In the expression: defaultErrorHandler defaultDynFlags

我究竟做错了什么?我已经检查了 GHC API 文档,但对这类事情还不够精通,无法理解其中的大部分内容。

最佳答案

该教程已过时。在 ghc-7.0.* 和之前的版本中,defaultErorHandler 的类型曾是

defaultErrorHandler :: (ExceptionMonad m, MonadIO m) => DynFlags -> m a -> m a

defaultDynFlags只是一个值。

从 ghc-7.2.* 开始, defaultErrorHandler 的类型是
defaultErrorHandler :: (ExceptionMonad m, MonadIO m) => LogAction -> m a -> m a
defaultDynFlags是一个函数
defaultDynFlags :: Settings -> DynFlags

LogAction是同义词
type LogAction = Severity -> SrcSpan -> PprStyle -> Message -> IO ()

在 7.6 中,它又发生了变化,我们现在有了
defaultErrorHandler :: (ExceptionMonad m, MonadIO m) => FatalMessager -> FlushOut -> m a -> m a


type FatalMessager = String -> IO ()

FlushOut成为 newtype包装 IO () .

我对 GHC Api 不是很熟悉(对我来说这个目标太快了),所以我不确定工作代码应该是什么样子,但是对于 7.2 和 7.4 系列, defaultErrorHandler 的第一个参数应该是 defaultLogAction .

还有 setContext 的类型已更改,我不知道我所拥有的是否符合您的要求,但它可以编译(使用 7.4.2;但除了 ghc-paths 模块之外,您还需要 ghc 包) - 我不过,还没有尝试运行它。
import GHC
import GHC.Paths
import DynFlags
import Unsafe.Coerce

main :: IO ()
main =
defaultErrorHandler defaultLogAction $ do
func <- runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
target <- guessTarget "Test.hs" Nothing
addTarget target
r <- load LoadAllTargets
case r of
Failed -> error "Compilation failed"
Succeeded -> do
m <- findModule (mkModuleName "Test") Nothing
setContext [IIModule m]
value <- compileExpr ("Test.print")
do let value' = (unsafeCoerce value) :: String -> IO ()
return value'
func "Hello"
return ()

关于api - Haskell GHC API 中的动态编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12779143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com