用于返回带有修改字段的Haskell记录的函数

Joh*_*ler 12 syntax haskell record

鉴于:

data MyRecord a = MyRecord{list :: [a], other_fields :: Char, …}
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个函数,它将一个新a的列表放入并返回一个新的MyRecord:

pushOntoList :: a -> MyRecord -> MyRecord
Run Code Online (Sandbox Code Playgroud)

问题:

有没有一种方法可以写出pushOntoList这样的方式,它不依赖于记录的其余部分,而只是简单地将其修改为未经修改?

问这个问题的另一种方法是你可以在pushOntoList不看清楚其余MyRecord定义的情况下编写吗?

Don*_*art 19

是的,非常容易使用记录访问者/标签语法:

b = a { list = 'x' : list a }
Run Code Online (Sandbox Code Playgroud)

在功能中:

pushOntoList c a = a { list = c : list a }
Run Code Online (Sandbox Code Playgroud)

例如

data MyRecord a = MyRecord {list :: [a], other_fields :: Char}
    deriving Show

main = do
    let a = MyRecord [] 'x'
        b = a { list = 'x' : list a }
    return (a,b)
Run Code Online (Sandbox Code Playgroud)

  • 是的,这很容易.我想在我自己的辩护中指出,语法根本没有出现在[了解你有些好的Haskell](http://learnyouahaskell.com/making-our-own-types-and-typeclasses)中, [真实世界Haskell](http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html)或[Haskell的温和介绍](http://www.haskell.org/tutorial/moretypes的.html). (5认同)
  • 语法出现在RWH第10章中. (4认同)
  • 这有点难以找到,所以[这里是第10章中与该部分的直接链接](http://book.realworldhaskell.org/read/code-case-study-parsing-a-binary-data-format. HTML#Parse.hs:modifyOffset). (4认同)