问题 Rust闭包和Haskell lambda有什么区别? [关闭]


最近我  关于如何将一堆具有相同签名的闭包放入Rust中的向量中。来自Haskell背景,它似乎有点复杂,Rust闭包每个都有自己独特的类型,需要一个特征来代表它们。在Haskell中,lambda是通过其签名键入的,如果签名相同,则类型相同。

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


11542
2018-02-28 18:45


起源

Haskell是否将其闭合单调化?我知道有关流融合的一些方面...... - Shepmaster
@Shepmaster我不是Haskell的专家,也不是Rust的初学者,这就是我想知道的原因。 - Roxy
@Shepmaster不,Haskell闭包不再是他们需要的单形(对于顶级定义偶尔有一个令人讨厌的异常,单态限制,甚至可以用编译器标志关闭)。 - Daniel Wagner


答案:


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

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

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


11
2018-02-28 19:26



FTR,Haskell lambdas也常常被内联。它通常只需要你的高阶函数 通过 lambda首先被内联,这可能是一些代码膨胀(但这实际上与C ++和Rust在lambda类型上实例化模板时所做的非常类似)。 - leftaroundabout