现在我正在努力理解
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)
应用的相同输入,我们得到不同的结果。
不纯吗??