gpt4 book ai didi

c - 惰性求值中的原语函数类型

转载 作者:行者123 更新时间:2023-11-30 15:01:17 27 4
gpt4 key购买 nike

我想知道像 Haskell 这样的惰性函数式编程语言中的原语函数的确切类型是什么。

假设 thunk 被评估为弱头正常形式的对象。那么,在像C这样的严格语言中,原语函数的类型应该是什么?

我的猜测是:

primitive1 : (thunk, thunk, ...) -> thunk
primitive2 : (thunk, thunk, ...) -> object

我认为原始函数应该作为参数传递 thunk,因为它们可能不需要其中的一些。但是,我不知道它们是否应该返回一个 thunk 或评估对象,而后者必须用如下所示的某些函数包装以使其变得懒惰。

lazy : ((thunk, thunk, ...) -> object) -> ((thunk, thunk, ...) -> thunk)

最佳答案

在 GHC 中,Haskell 原语函数(有时称为 PrimOp)是使用指针(指向“堆对象”)和拆箱的混合调用类型(包括 C 风格的整型、 double 型等)。 Haskell 类型系统确保 PrimOps 始终获取对象的数量、顺序和类型他们期望的指针和未装箱的值。这一点很重要但要注意,当基元需要指向特定类型的堆对象的指针时,例如 String,它需要一个指向堆对象的指针,该对象可能是一个列表构造函数(因为 Haskell String 是字符列表) thunk可以评估为列表构造函数。

因此,Haskell PrimOp 的“严格”类型没有区别介于 thunk 和非 thunk 之间。如果有一个原始函数例如,获取列表的长度(没有),使用您的符号,它可能具有以下类型:

primitiveLength : (list_object) -> unboxed_int

其中list_object将是指向任一列表的指针构造函数可以生成列表构造函数的thunk。

这确实是唯一明智的方法。 PrimOp 无法控制它的参数是否仍然是一个 thunk 还是已经被之前的一些计算部分(或完全!)评估,因此它必须准备好接受其中任何一个。

类似地,如果 Haskell PrimOp 返回一个堆对象,该对象在技术上可以是 thunk 或非 thunk,并且该选择不会影响原语的“严格”类型签名。

实际上,PrimOp 返回 thunk 并不是很有用。在惰性语言中,调用原语的事实意味着需要它的返回值。如果它返回一个 thunk,则需要立即评估该 thunk,那么为什么要返回一个 thunk?

(编辑添加:)顺便说一句,上面的 PrimOps 没有什么特别的:用​​户定义的 Haskell 函数也使用指针和未装箱类型的混合来调用(并且它们从不返回 thunk)。

关于c - 惰性求值中的原语函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41531163/

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