Próbuję zacząć od wiązania LLVM dla Haskell. Świetnym miejscem na rozpoczęcie jest Hello World.Haskell LLVM binding Niejednoznaczny Typ
Poniżej znajduje się na blogu autora wiążące.
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
Nie kompiluje się.
Zamiast dostać „Niejednoznaczne typ zmiennej n0' in the constraint: (type-level-0.2.4:Data.TypeLevel.Num.Sets.NatI n0) arising from a use of
getElementPtr0' Prawdopodobna fix: dodać podpis typu, która rozwiązuje te zmienną (y) Typ”
Oto odmiana, która działa
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
Pierwszy wydaje bardziej naturalne. Pytanie, które mam, to jaka jest niejednoznaczność w pierwszym i jak to naprawić. Drugie pytanie, jakie mam, brzmi: dlaczego drugi nie jest dwuznaczny.
czy to może być literówka i zapomniałem 0? getElementPtr0 <-? Po prostu zgaduję. –
Nie. Istnieją dwie różne funkcje. getElementPtr0 używa wartości domyślnej, gdzie getElementPtr nie ma - stąd dodatkowy argument. Ponadto, błąd jest, jestem prawie pewny, rzeczą typograficzną. To (GHC) chce, żebym powiedział mu coś bardziej szczegółowego na temat typografii. Po prostu nie zrozumiałem, czego chce. –
Może http://hpaste.org/ kompletne rzeczy, więc profesjonaliści mogą się z nim bawić :) –