haskell - 除了 Control.Lens.Setter 在 Haskell 中实现 Observable 的方法是什么?
问题描述
Control.Lens.Setter在 Haskell 中使用 Observable 功能非常出色。(更新数据集中的值时触发的函数/函子。)
但是,考虑到镜头不包含在标准环境中,然后需要额外安装,没有镜头,当我只想使用原始设置器功能时,例如带有字段标签:
data Foo = Foo {val :: Int}
这个怎么做?
ST Monad 适合这个目的吗?
谢谢。
解决方案
这里不是很清楚你在找什么,但如果你只是想更新一个记录字段,你可以使用 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 根本不允许突变。
推荐阅读
- python - Django - 除非另有说明,否则自动将身份验证器添加到每个端点
- python - SQLALCHEMY:使用@aggregated 定义多个聚合属性。如何正确插入数据
- html - HTML 连接新行
- reactjs - React Hook useMemo 被传递了一个不是数组文字的依赖列表
- postgresql - 如何在tableau中的同一工作表上从多个表中绘制图形
- javascript - 如何在 WordPress 中填写联系表格 7 中所需的“文件”字段
- python - Python FLASK 返回键盘中断
- python - Tensorflow 1.13.1、CUDA 10.0 和 RTX 3070 的 Blas GEMM 启动失败
- java - Android Studio 中的顶部导航栏标题替换
- python - 如何在pygame中使用不同的变量更改变量