速记方法只能修改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。