首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无透镜Haskell中的可变场结构

无透镜Haskell中的可变场结构
EN

Stack Overflow用户
提问于 2022-02-02 18:21:12
回答 1查看 95关注 0票数 1

我想编写一个函数,它生成一个具有可变值字段的结构。

最初,我是用TypeScript编写的,代码如下:

代码语言:javascript
复制
const Foo = <A>(a: A) =>
  ({
    x: a,             //mutable
    y: someFunction   //mutable
  });

基本上,x的类型总是A,而yA -> A,即使它们是可变的。

我只需要一个简单的setter和getter函数来变异字段,最好只使用ST-monad,而不想依赖于库(如透镜 )。

到目前为止,我发现的最接近的东西是ST可变数组Data.Array.MArray,但这个是针对数组而不是结构的。

您推荐什么是简单的智能方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-02 18:32:18

如果您定义的结构如下:

代码语言:javascript
复制
data Foo a = Foo {
    bar :: a,
    qux :: a -> a
}

例如,您可以定义一个对象:

代码语言:javascript
复制
myFoo :: Foo Int
myFoo = Foo 2 id

并使用以下内容创建一个轻巧的修改副本:

代码语言:javascript
复制
myFoo2 :: Foo Int
myFoo2 = myFoo { bar = 4 }

因此,您可以在STRef中使用它来处理引用,然后使用modifySTRef更新该引用,例如:

代码语言:javascript
复制
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)

代码语言:javascript
复制
ghci> print (bar (runST myST))
4
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70960816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档