gpt4 book ai didi

c - Haskell 中的高阶函数到底能做什么扩展 C 不能做的事情?

转载 作者:行者123 更新时间:2023-12-02 05:36:58 25 4
gpt4 key购买 nike

GCC 有 C extension允许使用嵌套函数。

实际上,我不明白 Haskell 中的高阶函数(或其他纯函数式语言)究竟能做什么而 C(函数指针和嵌套函数扩展)不能?

最佳答案

我从未使用过这个 gcc 扩展;但我会尝试根据我对您提供的链接的解释进行解释。

据我对文档的理解,关键区别在于那些嵌套函数不允许您构建函数式程序员在“闭包”下理解的内容——这些嵌套函数不能在其定义上下文之外使用,因为它们使用的堆栈变量在外部函数退出后丢失。

在 Haskell 中,当我执行以下操作时:

const x = \y -> x 
foo = const 2 -- remember or "close over" 2
bar = foo 1 -- now, bar == 2

你看到当将 const 应用于 2 时,参数 2 被我们称为 的闭包“保存”富。之后,在 bar 中,2 可以被调用并返回——因为它仍然在 foo 中被记住。但是,在 C 中:

typedef int (*int_to_int_fn)(int);
int_to_int_fn constant(int x)
{
int constant_impl(int y) { return x; }
return constant_impl;
}

int main()
{
int_to_int_fn foo = constant(2);
int bar = foo(1);
}

这可能甚至无法编译,但如果可以,那将违背我们对 C 函数的基本期望:foo 中的 x,由constant 的参数,需要保留在某个地方(可能不在堆栈上!),直到一段时间后 foo 被调用。这不是原始的工作方式——从这个意义上说,C 是原始的(我们可能需要在堆上分配一些东西,复制东西,稍后清理它,担心引用/值等)。


通过查看 C++11 lambda 语法可能会获得一些启迪。在那里,constant_impl 可以这样写:

auto constant_impl = [x](int y){ return x; }

[x] 部分正是我们告诉编译器“请帮我记住 x!”的地方。

关于c - Haskell 中的高阶函数到底能做什么扩展 C 不能做的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22912073/

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