Haskell有指针吗?

时间:2010-03-14 16:30:43

标签: pointers haskell language-design

你知道Haskell中是否有指针?

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

  • 如果否:是否有任何理由?

3 个答案:

答案 0 :(得分:22)

是的。请查看Foreign.PtrData.IORef

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

答案 1 :(得分:12)

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

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

如果您正在寻找引用 - 指向您希望变异的对象的指针 - 有STRef和IORef,它们提供与指针相同的许多用途。但是,你应该很少 - 如果有的话 - 需要参考。

答案 2 :(得分:7)

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

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

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