首页 文章

在复制其余字段时,在记录中分配单个字段的简便方法?

提问于
浏览
96

假设我有以下记录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 ),创建这样的函数将需要大量的打字,我觉得这是非常不必要的 .

是否有任何不那么繁琐的方法来做同样的事情?

3 回答

  • 123

    您无需定义辅助功能或使用镜头 . 标准Haskell已经满足您的需求 . 让我们以Don Stewart为例:

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

    然后你可以说 test { c = "Goodbye" } 来获得更新的记录 .

  • 4

    是的,这是一种更新记录字段的好方法 . 在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" }
    
  • 30

    对于lenses来说这是一个很好的工作:

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

    然后:

    setL c "Goodbye" test
    

    会将'test'的字段'c'更新为您的字符串 .

相关问题