我想撰寫一個函式來生成具有可變值欄位的結構。
原來我是用TypeScript寫的,代碼如下:
const Foo = <A>(a: A) =>
({
x: a, //mutable
y: someFunction //mutable
});
基本上, 的型別x總是A,甚至它們是可變的y。A -> A
我只需要一個簡單的 setter 和 getter 函式來改變欄位,最好只使用 ST-monad 并且不想依賴Lens等庫。
到目前為止,我發現的最接近的是 ST 可變陣列Data.Array.MArray,但這個是針對陣列而不是結構的。
您推薦什么簡單的智能方法?
uj5u.com熱心網友回復:
如果您定義如下結構:
data Foo a = Foo {
bar :: a,
qux :: a -> a
}
那么你可以例如定義一個物件:
myFoo :: Foo Int
myFoo = Foo 2 id
并創建一個稍微修改過的副本:
myFoo2 :: Foo Int
myFoo2 = myFoo { bar = 4 }
因此您可以在 an 中使用它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))
4
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427298.html
標籤:哈斯克尔
