Rust 闭包和 Haskell lambda 有啥区别? [关闭]

Posted

技术标签:

【中文标题】Rust 闭包和 Haskell lambda 有啥区别? [关闭]【英文标题】:What is the difference between a Rust closure and a Haskell lambda? [closed]Rust 闭包和 Haskell lambda 有什么区别? [关闭] 【发布时间】:2018-08-08 17:48:06 【问题描述】:

最近我asked 关于如何将一堆具有相同签名的闭包放入 Rust 中的向量中。来自 Haskell 背景,这似乎有点复杂,Rust 闭包每个都有自己独特的类型,并且需要一个 trait 来表示它们。在 Haskell 中,一个 lambda 由它的签名输入,如果签名相同,则类型相同。

Rust 闭包和导致这些差异的 Haskell lambda 函数之间是否存在语义差异?

【问题讨论】:

Haskell 是否将它们的闭包单态化?我知道流融合有一些方面...... @Shepmaster 我不是 Haskell 专家,只是 Rust 的初学者,这就是我想知道的原因。 @Shepmaster 不,Haskell 闭包并不比它们需要的更单态(***定义偶尔会出现令人讨厌的异常,单态限制,甚至可以通过编译器标志关闭) )。 【参考方案1】:

Rust 选择使用不同类型有两个性能优势:

编译器可以堆栈分配您关闭的数据(或将其嵌入到包含的数据结构中) 因为它知道在编译时闭包引用了哪个函数,所以它可以静态分派调用,甚至内联调用。

您也可以选择改用Box<Fn>。这会花费堆分配并导致间接调用,但作为交换,每个签名只有一种类型。

【讨论】:

FTR,Haskell lambdas 通常也可以内联。它通常只是要求您将 lambda 传递给的高阶函数首先被内联,这可能有点代码膨胀(但这实际上与 C++ 和 Rust 在实例化时所做的非常相似lambda 类型上的模板)。

以上是关于Rust 闭包和 Haskell lambda 有啥区别? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Go的闭包看你犯错,Rust却默默帮你排坑

Go的闭包看你犯错,Rust却默默帮你排坑

从 Rust 调用动态链接的 Haskell 代码

用 Rust 处理 WebAssembly 中的闭包而不是使用忘记和泄漏内存有啥更好的方法?

那些害死Haskell的,也会害死Rust

Haskell入门篇六:匿名函数定义