Haskell有指针吗?

cur*_*omp 13 haskell pointers language-design

你知道Haskell中是否有指针?

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

  • 如果不是:有什么理由吗?

Yac*_*oby 23

是的,有.看一下Foreign.PtrData.IORef

我怀疑这不是你要求的.由于Haskell在很大程度上没有状态,因此它意味着指针不适合语言设计.在函数外部有一个指向内存的指针意味着函数不再是纯函数,只允许指向当前函数中的值是无用的.

  • 我怀疑他正在寻找一种方法来传递大型数据结构而不创建副本,这是基于错误的假设,即将值传递给函数会创建一个类似于在C++中按值调用时的复制. (19认同)

Don*_*art 12

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

指针用于与C代码进行互操作.不是每天Haskell编程.

如果你正在寻找引用 - 指向你想要改变的对象的指针 - 有STRef和IORef,它们提供许多与指针相同的用途.但是,你应该很少 - 如果有的话 - 需要Refs.


Sam*_*amB 7

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

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

按需传递就像传递引用一样,除了任何给定的引用既可以引用实际的评估值(不能更改),也可以引用尚未评估的值的"thunk".维基百科有更多.