gpt4 book ai didi

Haskell LLVM 绑定(bind)模糊类型

转载 作者:行者123 更新时间:2023-12-02 16:56:03 25 4
gpt4 key购买 nike

我正在尝试开始使用 Haskell 的 LLVM 绑定(bind)。 Hello World 是一个很好的起点。

以下内容来自绑定(bind)作者的博客。

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”:
(类型级别-0.2.4:Data.TypeLevel.Num.Sets.NatI n0)
由于使用
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

第一个似乎更自然。我的问题是第一个中的歧义是什么,以及如何解决它。我的第二个问题是为什么第二个没有歧义。

最佳答案

好的。所以我解决了这个问题。这确实是一个类型类的东西。这只会让我更加困惑。不过,我确实有解决方案的答案。但请随时帮助我理解。首先,进行一些挖掘。函数 createStringNul 具有类型

createString :: String -> TGlobal (Array n Word8)

好吧。编译器遇到的问题是数组类型中的“n”不明确。它实际上可以是世界上的任何东西。查找,数组,然后你就看到了

newtype Array n a

现在不是那么明显了,但是经过一点挖掘,特别是对 getElementPtr 的调用,我们发现 n 实际上应该是 Nat n,这是一种类型级别的方法来固定元素的大小大批。现在,数组 n a 的定义实际上并不关心它实际上只是 [a] 的类型同义词。所以你可以使用 D0、D9 或任何你想要的数据.类型级别.次数.重复次数包裹。固定数组的大小,虽然这个函数实际上没有考虑到一个好主意。但无论如何,改变 greetz <- createStringNul "你好,世界!"到 greetz <- createStringNul "你好,世界!"::TGlobal(数组 D0 Word8)有效。

这是有趣的部分......我没想到它会起作用。 D0 应该是 0,所以我不明白为什么它允许我在 0 大小的“数组”中存储这么多字符但是,如果您查看源代码,您会立即清楚类型限制实际上并不存在关注了。

好吧,无论如何,在编译后,人们意识到 createStringNul 已被弃用,而 withStringNul 是首选。只是我不完全理解 withStringNul 的类型是如何工作的。

关于Haskell LLVM 绑定(bind)模糊类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15978164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com