我需要更新一个非常大的默认记录的一个字段。
由于默认值可能会更改,所以我不希望手动重新生成整个记录。
现在我遇到了这样做的方式,但我不知道它是如何工作的:
unaggregate :: MyResult -> MyResult
unaggregate calc@MyResult{..} = calc{ the_defaults = the_override
`mappend` the_defaults }
where
the_override = create ("aggregation" := False)我已经尝试搜索'Haskell @ operator‘在谷歌,但它没有立即返回有用的信息。
我在某个地方看到calc@MyResult{..}对变量进行模式匹配,但我不知道calc为MyResult记录做了什么.
我还查过mappend (和Monoids),我也不知道这些是如何工作的.
谢谢你的帮助
发布于 2017-04-10 01:13:38
@符号被称为“作为模式”。在上面的例子中,您可以使用calc来表示整个记录。通常你会像这样使用它:calc@(MyResult someResult) --这样你就可以得到所有的东西和你要匹配的部分。您可以对列表(myList@(myHead:myTail))或元组(myTuple@(myFst, mySnd) )做同样的事情。很方便!
MyResult{..}使用RecordWildcards。这是一个整洁的扩展!但是RecordWildcards并不能帮助您只更新记录的一个字段。
您可以这样做:calc { theFieldYouWantToUpdate = somethingNew }。
https://stackoverflow.com/questions/43313433
复制相似问题