Tôi đang cố gắng bắt đầu với việc ràng buộc LLVM cho Haskell. Một nơi tuyệt vời để bắt đầu là Hello World.Haskell LLVM ràng buộc Loại mơ hồ
Sau đây là từ một blog của tác giả về ràng buộc.
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
Nó không biên dịch.
Thay vào đó tôi nhận được "loại mơ hồ biến n0' in the constraint: (type-level-0.2.4:Data.TypeLevel.Num.Sets.NatI n0) arising from a use of
getElementPtr0' sửa chữa dự kiến: thêm một chữ ký kiểu đó sửa chữa các loại biến (s)"
Đây là một biến thể mà làm việc
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
Đầu tiên dường như tự nhiên hơn. Câu hỏi tôi có là sự mơ hồ trong lần đầu tiên, và làm cách nào để khắc phục nó. Câu hỏi thứ hai tôi có là tại sao thứ hai không mơ hồ.
nó có thể là lỗi đánh máy và quên 0 không? getElementPtr0 <-? Tôi chỉ đoán ở đây. –
Không. Có hai chức năng khác nhau. getElementPtr0 sử dụng một mặc định, trong đó getElementPtr không - vì thế đối số thừa. Ngoài ra, lỗi là, tôi khá chắc chắn, một điều typeclass. Nó (GHC) muốn tôi nói điều gì đó cụ thể hơn về typeclass. Tôi chỉ không tìm ra những gì nó muốn. –
Có lẽ http://hpaste.org/ điều hoàn chỉnh để người chuyên nghiệp có thể thích thú với nó :) –