锈封和Haskell lambda之间有什么区别?

锈封和Haskell lambda之间有什么区别?,haskell,lambda,rust,closures,Haskell,Lambda,Rust,Closures,最近我讨论了如何将一组具有相同签名的闭包放入Rust中的向量中。来自Haskell的背景,看起来有点复杂,每个锈迹封闭都有自己独特的类型,需要一个特征来表示它们。在Haskell中,lambda由其签名键入,如果签名相同,则类型相同 Rust闭包和Haskell lambda函数之间是否存在语义上的差异?Rust选择使用不同的类型有两个性能优势: 编译器可以对关闭的数据进行堆栈分配(或将其嵌入到包含的数据结构中) 因为它知道闭包在编译时引用哪个函数,所以它可以静态地分派调用,甚至内联调用 您

最近我讨论了如何将一组具有相同签名的闭包放入Rust中的向量中。来自Haskell的背景,看起来有点复杂,每个锈迹封闭都有自己独特的类型,需要一个特征来表示它们。在Haskell中,lambda由其签名键入,如果签名相同,则类型相同


Rust闭包和Haskell lambda函数之间是否存在语义上的差异?Rust选择使用不同的类型有两个性能优势:

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

您也可以选择使用
。这会消耗堆分配并导致间接调用,但在交换中,每个签名只有一种类型。

Haskell单态化了闭包吗?我知道流融合有一些方面…@Shepmaster我不是Haskell方面的专家,只是Rust方面的初学者,这就是我想知道的原因。@Shepmaster不,Haskell闭包的单态性并不比它们需要的多(对于顶级定义,偶尔会有一个恼人的例外,即单态限制,甚至可以通过编译器标志关闭)。FTR、Haskell lambdas也经常可以内联。它通常只要求首先内联传递lambda的高阶函数,这可能有点代码膨胀(但这实际上与C++在模板上的模板和锈时的情况非常相似)。