你知道Haskell中是否有指针?
如果是:您如何使用它们?他们有什么问题吗?为什么他们不受欢迎?
如果否:是否有任何理由?
答案 0 :(得分:22)
是的。请查看Foreign.Ptr或Data.IORef
我怀疑这不是你要求的。由于Haskell在很大程度上没有状态,因此它意味着指针不适合语言设计。在函数外部有一个指向内存的指针意味着函数不再是纯函数,只允许指向当前函数中的值是无用的。
答案 1 :(得分:12)
Haskell确实通过外部函数接口扩展提供指针。例如,请查看Foreign.Storable。
指针用于与C代码进行互操作。不是每天Haskell编程。
如果您正在寻找引用 - 指向您希望变异的对象的指针 - 有STRef和IORef,它们提供与指针相同的许多用途。但是,你应该很少 - 如果有的话 - 需要参考。
答案 2 :(得分:7)
如果您只是希望避免复制大值,就像sepp2k所假设的那样,那么您无需做任何事情:在大多数实现中,所有非平凡值都在堆上单独分配,并通过机器级地址相互引用(即指针)。但同样,你不需要对此做任何事情,它会为你照顾。
要回答关于如何传递值的问题,它们以实现认为合适的方式传递:因为无论如何都不能改变值,它不会影响代码的含义(只要严格性受到尊重);通常这是按需要的,除非你传递给编译器可以看到的Int值已经被评估过了......
按需传递就像传递引用一样,除了任何给定的引用既可以引用实际的评估值(不能更改),也可以引用尚未评估的值的“thunk” 。维基百科有more。