速记方法只能修改logging中的一个字段(复制一个logging只能改变一个字段)?

假设我有以下loggingADT:

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

我想要一个接受logging并返回一个logging(相同types)的函数,其中除了一个字段之外,其他字段的值都与作为parameter passing的值相同,如下所示:

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

以上的工作,但是对于有更多字段(比如说10 )的logging来说,创build这样一个函数将需要大量的input,我觉得这是不必要的。

有没有更简单的方法来做同样的事情?

是的,有更新logging字段的好方法。 在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" } 

这是一个很好的镜头 :

 data Foo = Foo { a :: Int, b :: Int , c :: String } test = Foo 1 2 "Hello" 

然后:

 setL c "Goodbye" test 

会更新'test'字段'c'到你的string。