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 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
最初のほうがより自然に見えます。私が持っている質問は、最初のあいまいさとは何か、それをどのように修正するかです。私が持っている2番目の質問は、なぜ2番目があいまいではないのかということです.