Haskell 中的 MutVar# 是不纯的吗?

问题描述 投票:0回答:0

现在我正在努力理解

State
ST
STRef
等..

首先,我调查了Monad本身,

s -> (s, a)
.

我没有得到

s -> (s, a)
和“状态”之间的任何有意义的关系,所以我经历了
newSTRef
readSTRef
writeSTRef
.

他们基于

MutVar#
.

好吧,Haskell 没有任何“变量”。因此,某种

State
ST
的东西将被设计来帮助 Haskell 在保持“纯粹性”的同时拥有“类似变量”的东西。

派生到,

MutVar#
及其对应的API也应该是纯的。

但好像不是。

看看我有什么。

fun :: State# RealWorld -> (Int, Int, Int)
fun s# = let (# a#, var# #) :: (# State# RealWorld, MutVar# RealWorld Int #) = newMutVar# 0 s#
             (# b#, o1 #) :: (# State# RealWorld, Int #) = readMutVar# var# s#
             c# = writeMutVar# var# 10 a#
             (# d#, o2 #) :: (# State# RealWorld, Int #) = readMutVar# var# s#
             e# = writeMutVar# var# 20 c#
             (# f#, o3 #) :: (# State# RealWorld, Int #) = readMutVar# var# s# in
             (o1, o2, o3)

当我们将

realWorld#
放入
fun
时,我们得到
(0, 10, 20)

对于

readMutVar#
(#var, #s)
应用的相同输入,我们得到不同的结果。

不纯吗??

haskell state-monad
© www.soinside.com 2019 - 2024. All rights reserved.