我试图开始使用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':
(type-level-0.2.4:Data.TypeLevel.Num.Sets.NatI n0)
arising from a use of
getElementPtr0'
可能的解决方法:添加一个类型签名,以修复这些类型变量”
这里有一个可以工作的变体
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
第一个句子似乎更自然。我的问题是第一个句子的歧义在哪里,以及如何解决。我还想知道为什么第二个句子不会产生歧义。