【发布时间】:2017-01-08 09:17:06
【问题描述】:
我想知道 Haskell 等惰性函数式编程语言中原始函数的确切类型是什么。
假设 thunk 被评估为弱头范式的对象。那么,像 C 这样的严格语言中的原始函数应该是什么类型呢?
我的猜测是:
primitive1 : (thunk, thunk, ...) -> thunk
primitive2 : (thunk, thunk, ...) -> object
我认为原始函数应该作为参数传递 thunk,因为它们可能不需要其中的一些。但是,我不知道他们是否应该返回一个 thunk 或评估对象,而后者必须用下面这样的函数包装以使其变得惰性。
lazy : ((thunk, thunk, ...) -> object) -> ((thunk, thunk, ...) -> thunk)
【问题讨论】:
-
嗯,这个问题没有唯一的答案,因为它取决于实现。在 ghc 中,原始操作具有原始类型,即与 C 中的类型相同。您可以在 thunk 中包装和展开原始类型的单独操作。
-
@augustss if 和 case 表达式怎么样?我猜他们的原语必须直接传递 thunk。或者,它们是咖喱的吗?
-
一个 if 表达式被翻译成一个 case 表达式。并且没有用于 case 的原语,它被翻译成取决于类型的(抽象)机器代码。简化后,首先将检查对象评估为 WHNF,然后提取其构造函数编号并将其用作跳转表中的偏移量。您跳转到的代码将解包构造函数的字段并继续进行评估。
标签: c haskell functional-programming lazy-evaluation