首页 > 解决方案 > 除了 Control.Lens.Setter 在 Haskell 中实现 Observable 的方法是什么?

问题描述

Control.Lens.Setter在 Haskell 中使用 Observable 功能非常出色。(更新数据集中的值时触发的函数/函子。)

但是,考虑到镜头不包含在标准环境中,然后需要额外安装,没有镜头,当我只想使用原始设置器功能时,例如带有字段标签:

data Foo = Foo {val :: Int} 

这个怎么做?

ST Monad 适合这个目的吗?

谢谢。

标签: haskellgetter-settersetter

解决方案


这里不是很清楚你在找什么,但如果你只是想更新一个记录字段,你可以使用 Haskell 记录更新语法:

x = Foo { val = 5 }
y = x { val = 42 }

这适用于任何记录,具有任意数量的字段,并且您不需要列出所有字段,只需列出您想要更新的字段,例如:

data D = D { a :: String, b :: Int }

x = D { a = "foo", b = 42 }
y = x { a = "bar" }  -- now y = D { a = "bar", b = 42 }
z = x { b = 43 }  -- now z = D { a = "foo", b = 43 }

请记住,这实际上并不会更新(“更改”、“变异”)内存中的值,而是创建记录的副本,其中所有字段都等于原始记录的字段,但更新的字段除外。镜头的工作方式相同,事实上 Haskell 中的所有内容都可以,因为 Haskell 根本不允许突变。


推荐阅读