所以我对这整个函数式编程交易都很陌生。在我最近学习Haskell的冒险中,我遇到了一个奇怪的问题。我知道GHC互动环境允许所谓的“懒惰”#34;评估,这意味着只在需要值时才评估Haskell表达式。这听起来像是一个非常有用的行为,因为它可以帮助简化优化过程。我的下一个逻辑思路是:那么当Haskell编译成机器代码时会发生什么?你是否失去了懒惰?它变成了“必要的”#34;码?
答案 0 :(得分:5)
可以肯定的是,在当代硬件上,Haskell代码最终变成了命令式代码,即汇编代码,这是必不可少的。
这并不意味着懒惰必须消失,事实上并非如此。请注意,可以使用命令式语言对惰性数据结构进行建模。例如,可以执行以下操作来为惰性值列表建模(注意:我不说现有的Haskell实现就是这样做的,我只想展示如何< / em>完成):
struct List {
Value *val;
struct {
bool evaluated;
union {
struct List *list;
struct List *(*eval)();
} ptr;
} next;
};
因此,每当需要转到列表的尾部时,可能有一个已经计算过的指针(next.ptr.list
),或者只是一个指向计算这样一个指针的函数的指针({{ 1}})。