Haskell的懒惰是否在编辑中得到保留?

nam*_*ame -1 haskell functional-programming

所以我对这整个函数式编程交易都不熟悉.在我最近学习Haskell的冒险中,我遇到了一个奇怪的问题.我知道GHC交互环境允许所谓的"懒惰"评估,这意味着只在需要它们的值时才评估Haskell表达式.这听起来像是一个非常有用的行为,因为它可以帮助简化优化过程.我的下一个逻辑思路是:那么当Haskell编译成机器代码时会发生什么?你是否失去了懒惰?它变成了"命令式"代码吗?

Ing*_*ngo 5

可以肯定的是,在当代硬件上,Haskell代码最终变成了命令式代码,即汇编代码,这是必不可少的.

这并不意味着懒惰必须消失,事实上并非如此.请注意,可以使用命令式语言对惰性数据结构进行建模.例如,一个可以做到以下几点来模拟值的懒列表(注:我不是说现有的哈斯克尔实现这样做的,我只是想表明它如何做到):

struct List {
    Value *val;
    struct {
        bool evaluated;
        union {
            struct List *list;
            struct List *(*eval)();
        } ptr;
    } next;
};
Run Code Online (Sandbox Code Playgroud)

因此,每当需要转到列表的尾部时,可能有一个已经计算过的指向它的指针(next.ptr.list),或者只是一个指向计算这样一个指针(next.ptr.eval)的函数的指针.