我需要更新非常大的默认记录的一个字段。
由于默认值可能会更改,因此我不想手动重建整个记录。
现在,我遇到了以下方法,但是我不确定它是如何工作的:
unaggregate :: MyResult -> MyResult
unaggregate calc@MyResult{..} = calc{ the_defaults = the_override
`mappend` the_defaults }
where
the_override = create ("aggregation" := False)
Run Code Online (Sandbox Code Playgroud)
我尝试在Google中搜索“ Haskell @运算符”,但是它不会立即返回有用的信息。
我看到某个地方calc@MyResult{..} 对变量进行模式匹配,但我看不到calc该 MyResult记录有什么变量...
我也查了一下mappend(和Monoids),也不确定它们是如何工作的...
感谢您的任何帮助
该@符号称为“原样”。在上面的示例中,您可以calc用来表示整个记录。通常,您会像这样使用它:calc@(MyResult someResult)-这样一来,您既可以拥有整个商品,也可以拥有与之匹配的商品。您可以使用列表(myList@(myHead:myTail))或元组(myTuple@(myFst, mySnd)。进行相同操作。这非常方便!
MyResult{..}使用RecordWildcards。这是一个很好的扩展!但是RecordWildcards不能帮助您仅更新记录的一个字段。
您可以改为这样做:calc { theFieldYouWantToUpdate = somethingNew }。