在Haskell中通过引用?

Mat*_*Mut 2 haskell pass-by-reference

来自C#背景,我想说ref在某些情况下,关键字非常有用,在这些情况下,需要更改方法参数,以直接影响用于设置参数的值类型的传递值null.

此外,out当返回大量各种逻辑上未连接的值时,关键字可以派上用场.

我的问题是:是否可以通过Haskell中的引用将参数传递给函数?如果没有,直接替代方案(如果有的话)是什么?

new*_*cct 7

在像Haskell和ML 这样的语言中,"pass-by-value"和"pass-by-reference"之间没有区别,因为不可能在这些语言中分配变量.在影响任何传递的变量时,首先不可能对方法参数进行"更改".


fja*_*rri 5

我的问题是:是否可以通过Haskell中的引用将参数传递给函数?如果没有,直接替代方案(如果有的话)是什么?

不,Haskell中的值是不可变的(好吧,do符号可以创建一些可变性的错觉,但它都发生在函数内部并且是完全不同的主题).如果要更改该值,则必须返回更改的值并让调用者处理它.例如,请参阅next返回值和更新的RNG 的随机数生成函数.

此外,当返回大量各种逻辑上未连接的值时,out关键字可以派上用场.

因此,你不能拥有out.如果要返回几个完全断开连接的值(此时您可能会想到为什么从单个函数返回断开连接的值),返回一个元组.


dfe*_*uer 5

这取决于背景.没有任何背景,不,你不能(至少不是你的意思).有了上下文,如果你愿意,你很可能会这样做.特别是,如果您正在使用IO或者ST,您可以使用IORef或STRef分别使用或者可变数组,向量,哈希表,弱哈希表(IO仅限,我相信)等.一个函数可以使用其中的一个或多个产生一个动作(当执行时)将修改这些引用的内容.

另一种背景,StateT给出了纯粹实现可变"状态"值的错觉.您可以使用复合状态并将镜头传入其中,为某些目的模拟参考.