使用Haskell @更新记录中的单个字段

use*_*476 2 haskell

我需要更新非常大的默认记录的一个字段。

由于默认值可能会更改,因此我不想手动重建整个记录。

现在,我遇到了以下方法,但是我不确定它是如何工作的:

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{..} 对变量进行模式匹配,但我看不到calcMyResult记录有什么变量...

我也查了一下mappend(和Monoids),也不确定它们是如何工作的...

感谢您的任何帮助

Lib*_*bby 5

@符号称为“原样”。在上面的示例中,您可以calc用来表示整个记录。通常,您会像这样使用它:calc@(MyResult someResult)-这样一来,您既可以拥有整个商品,也可以拥有与之匹配的商品。您可以使用列表(myList@(myHead:myTail))或元组(myTuple@(myFst, mySnd)。进行相同操作。这非常方便!

MyResult{..}使用RecordWildcards。这是一个很好的扩展!但是RecordWildcards不能帮助您仅更新记录的一个字段。

您可以改为这样做:calc { theFieldYouWantToUpdate = somethingNew }