Shorthand way for assigning a single field in a record, while copying the rest of the fields?

前端 未结 3 550
陌清茗
陌清茗 2020-12-12 13:04

Let\'s say I have the following record ADT:

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

I want a function that takes a record

相关标签:
3条回答
  • 2020-12-12 13:46

    Yes, there's a nice way of updating record fields. In GHCi you can do --

    > 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" }
    
    0 讨论(0)
  • 2020-12-12 13:50

    You don’t need to define auxiliary functions or employ lenses. Standard Haskell has already what you need. Let’s take the example by Don Stewart:

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

    Then you can just say test { c = "Goodbye" } to get an updated record.

    0 讨论(0)
  • 2020-12-12 14:07

    This is a good job for lenses:

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

    Then:

    setL c "Goodbye" test
    

    would update field 'c' of 'test' to your string.

    0 讨论(0)
提交回复
热议问题