【发布时间】:2013-04-12 18:14:09
【问题描述】:
我正在尝试开始使用 Haskell 的 LLVM 绑定。 Hello World 是一个很好的起点。
以下内容来自绑定作者的博客。
bldGreet :: CodeGenModule (Function (IO ()))
bldGreet = do
puts <- newNamedFunction ExternalLinkage "puts" :: TFunction (Ptr Word8 -> IO Word32)
greetz <- createStringNul "Hello, World!"
func <- createFunction ExternalLinkage $ do
tmp <- getElementPtr greetz (0::Word32, (0::Word32, ()))
call puts tmp -- Throw away return value.
ret ()
return func
它无法编译。
相反,我得到“模棱两可的类型变量n0' in the constraint:
(type-level-0.2.4:Data.TypeLevel.Num.Sets.NatI n0)
arising from a use ofgetElementPtr0'
可能的修复:添加修复这些类型变量的类型签名“
这是一个有效的变体
llvmModule :: TFunction (IO Word32)
llvmModule =
withStringNul "Hello world!" $ \s -> do
puts <- newNamedFunction ExternalLinkage "puts" :: TFunction (Ptr Word8 -> IO Word32)
main <- newNamedFunction ExternalLinkage "main" :: TFunction (IO Word32)
defineFunction main $ do
tmp <- getElementPtr0 s (0::Word32, ())
_ <- call puts tmp
ret (0::Word32)
return main
第一个似乎更自然。我的问题是第一个歧义是什么,我该如何解决。我的第二个问题是为什么第二个不模棱两可。
【问题讨论】:
-
会不会是错字而忘记了 0? getElementPtr0
-
没有。有两种不同的功能。 getElementPtr0 使用默认值,而 getElementPtr 不使用 - 因此有额外的参数。另外,我很确定,错误是一个类型类的事情。 It(GHC) 希望我告诉它有关类型类的更具体的信息。我只是还没弄清楚它想要什么。
-
也许 hpaste.org 完整的东西,所以专业人士可以摆弄它:)