假设我有以下记录ADT:
data Foo = Bar { a :: Integer, b :: String, c :: String }
Run Code Online (Sandbox Code Playgroud)
我想要一个记录并返回记录(相同类型)的函数,其中除了一个字段之外的所有字段都具有与作为参数传递的值相同的值,如下所示:
walkDuck x = Bar { a = a x, b = b x, c = lemonadeStand (a x) (b x) }
Run Code Online (Sandbox Code Playgroud)
上面的工作,但对于具有更多字段的记录(比如说10),创建这样的函数将需要大量的打字,我觉得这是非常不必要的.
是否有任何不那么繁琐的方式做同样的事情?
Chr*_*lor 141
是的,这是一种更新记录字段的好方法.在GHCi你可以做 -
> data Foo = Foo { a :: Int, b :: Int, c :: String } -- define a Foo
> let foo = Foo { a = 1, b = 2, c = "Hello" } -- create a Foo
> let updateFoo x = x { c = "Goodbye" } -- function to update Foos
> updateFoo foo -- update the Foo
Foo {a = 1, b = 2, c = "Goodbye" }
Run Code Online (Sandbox Code Playgroud)
Don*_*art 33
这是一个很好的镜头工作:
data Foo = Foo { a :: Int, b :: Int , c :: String }
test = Foo 1 2 "Hello"
Run Code Online (Sandbox Code Playgroud)
然后:
setL c "Goodbye" test
Run Code Online (Sandbox Code Playgroud)
会将'test'的字段'c'更新为您的字符串.
Wol*_*sch 12
您无需定义辅助功能或使用镜头.标准Haskell已经满足您的需求.让我们以Don Stewart为例:
data Foo = Foo { a :: Int, b :: Int , c :: String }
test = Foo 1 2 "Hello"
Run Code Online (Sandbox Code Playgroud)
然后你可以说test { c = "Goodbye" }要获得更新的记录.