我想编写一个函数,它生成一个具有可变值字段的结构。
最初,我是用TypeScript编写的,代码如下:
const Foo = <A>(a: A) =>
({
x: a, //mutable
y: someFunction //mutable
});基本上,x的类型总是A,而y是A -> A,即使它们是可变的。
我只需要一个简单的setter和getter函数来变异字段,最好只使用ST-monad,而不想依赖于库(如透镜 )。
到目前为止,我发现的最接近的东西是ST可变数组Data.Array.MArray,但这个是针对数组而不是结构的。
您推荐什么是简单的智能方法?
发布于 2022-02-02 18:32:18
如果您定义的结构如下:
data Foo a = Foo {
bar :: a,
qux :: a -> a
}例如,您可以定义一个对象:
myFoo :: Foo Int
myFoo = Foo 2 id并使用以下内容创建一个轻巧的修改副本:
myFoo2 :: Foo Int
myFoo2 = myFoo { bar = 4 }因此,您可以在STRef中使用它来处理引用,然后使用modifySTRef更新该引用,例如:
myST :: ST s (Foo Int)
myST = do
ref <- newSTRef (Foo 2 id)
modifySTRef ref (\x -> x { bar = 4 })
readSTRef ref因此,您可以使用runST myST运行此操作。例如,我们可以在计算bar后打印ST s (Foo Int)
ghci> print (bar (runST myST))
4https://stackoverflow.com/questions/70960816
复制相似问题