【问题标题】:Does Haskell have pointers?Haskell 有指针吗?
【发布时间】:2010-03-14 16:30:43
【问题描述】:

你知道Haskell中是否有指针吗?

  • 如果是:您如何使用它们?他们有什么问题吗?为什么它们不受欢迎?

  • 如果不是:有什么原因吗?

【问题讨论】:

标签: pointers haskell language-design


【解决方案1】:

是的,有。看看Foreign.PtrData.IORef

我怀疑这不是你想要的。由于 Haskell 大部分情况下没有状态,这意味着指针不适合语言设计。在函数之外有一个指向内存的指针意味着一个函数不再是纯函数,只允许指向当前函数内的值的指针是没有用的。

【讨论】:

  • 我怀疑他正在寻找一种在不创建副本的情况下传递大型数据结构的方法,这是基于错误的假设,即将值传递给函数会创建一个副本,就像它在进行调用时所做的那样- C++ 中的值。
  • @sepp2k 或用于与内存映射设备通信。
【解决方案2】:

Haskell 确实通过外部函数接口扩展提供了指针。例如,查看Foreign.Storable

指针用于与 C 代码进行互操作。并非每天都适合 Haskell 编程。

如果你正在寻找references——指向你希望改变的对象的指针——有STRef 和IORef,它们的许多用途与指针相同。但是,您应该很少(如果有的话)需要 Refs。

【讨论】:

    【解决方案3】:

    如果你只是想避免像 sepp2k 假设的那样复制大值,那么你什么都不用做:在大多数实现中,所有重要的值都在堆上单独分配并通过机器级地址相互引用(即指针)。但同样,您无需对此做任何事情,它会为您处理好。

    要回答您有关如何传递值的问题,它们以实现认为合适的任何方式传递:因为无论如何您都不能改变值,它不会影响代码的含义(只要严格受到尊重);通常这是按需要解决的,除非你通过例如编译器可以看到的 int 值已经被评估...

    Pass-by-need 与 pass-by-reference 类似,只是任何给定的引用都可以引用实际评估的值(无法更改),或者引用尚未评估的值的“thunk” .维基百科有more

    【讨论】:

    • 这是 Haskell 的主要优势之一:在大多数情况下,您只需做很少的事情即可确保效率。
    猜你喜欢
    • 1970-01-01
    • 2014-01-06
    • 2013-06-27
    • 2010-10-19
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    相关资源
    最近更新 更多