在创纪录的分配单场,而复制其余字段速记方法是什么?(Shorthand way for assign

2019-07-20 03:45发布

比方说,我有如下记载ADT:

data Foo = Bar { a :: Integer, b :: String, c :: String }

我想一个函数,它记录并返回一个记录(同类型),其中字段所有,但一个有一个传递的参数,像这样相同的值:

walkDuck x = Bar { a = a x, b = b x, c = lemonadeStand (a x) (b x) }

上述工作,但对于更多的字段的记录(说10 ),创造了这样的功能将需要大量的输入,我觉得完全没有必要。

是否有做同样的任何不那么单调乏味的方式?

Answer 1:

是的,有更新记录字段的一个很好的方式。 在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" }


Answer 2:

这是一个很好的工作镜头 :

data Foo = Foo { a :: Int, b :: Int , c :: String }

test = Foo 1 2 "Hello"

然后:

setL c "Goodbye" test

将更新“测试”的领域“C”到您的字符串。



Answer 3:

你并不需要定义辅助功能或使用的镜头。 标准Haskell有已经你需要什么。 让我们由唐·斯图尔特的例子:

data Foo = Foo { a :: Int, b :: Int , c :: String }

test = Foo 1 2 "Hello"

然后,你可以说test { c = "Goodbye" }以获取更新的记录。



文章来源: Shorthand way for assigning a single field in a record, while copying the rest of the fields?