2017-04-10 15 views
0

非常に大きなデフォルトレコードの1つのフィールドを更新する必要があります。Haskellでレコード内の単一フィールドを更新する@

デフォルトが変更される可能性があるため、レコード全体を手動で再構築する必要はありません。

は今、私はこれを行うには、次のように遭遇してきたが、私はそれがどのように動作するかわからない:

unaggregate :: MyResult -> MyResult 
unaggregate [email protected]{..} = calc{ the_defaults = the_override 
             `mappend` the_defaults } 
    where 
    the_override = create ("aggregation" := False) 

私はグーグルで「Haskellの@演算子」を探して試してみましたが、それはすぐに戻りません有用な情報。

は、私がどこか [email protected]{..}見変数のパターンマッチングを行いますが、私はまた私が見上げている

... calcMyResultレコードのない変数何を表示されていないmappend(およびモノイド)と私はどのように確認していませんこれらの作業のいずれか...

は、任意のヘルプ

答えて

2

ありがとうござい@記号を「パターン」と呼ばれています。上記の例では、calcを使用してレコード全体を意味することができます。通常は次のように使用します:[email protected](MyResult someResult) - これで、あなたがマッチしているものと駒の両方を持つことができます。あなたはリスト([email protected](myHead:myTail))またはタプル([email protected](myFst, mySnd)と同じことを行うことができます。これはかなり便利です!

MyResult{..}RecordWildcardsを使用しています。きちんとした拡張機能です!しかしRecordWildcardsあなたは、レコードのただ一つのフィールドを更新助けない。

あなたが代わりにこれを行うことができます。calc { theFieldYouWantToUpdate = somethingNew }

+0

'mappend'何をするのか、多くの感謝を – user3203476

+0

あなたは上記の言ったように、それはモノイドの操作だモノイドa)が空であることと、b)とすることができるものです"!?。一緒に追加されました。リストはモノイドです。空のリスト( '[]')を使うことができますし、リストを一緒に追加することもできます( 'mappend [1] [2] == [1,2]')。メイベスや地図、テキストなどの多くのものもモノイドを含んでいるので、それらも「マペンド」することができます。 – Libby

+0

非常に明確な返信です!あなたの時間のために多くのありがとう! – user3203476