1

私はデータ型を持っています:

data Person  = Person {
    person_id :: Int,
    person_firstname :: String,
    person_surname :: String,
    person_address :: Address
}

haskellの which の値は、person_firstname他のすべてをコピーすることを意味します。これを行うより簡単な方法はありますか:

        person'' = Person (person_id person') newName (person_surname person') (person_address person')
4

2 に答える 2

3

記録更新:

person' = person { person_firstname = newName }

任意の式で機能することに注意してください。

somebody = (Person 0 "Nobody" "Nothingson" "123 Fake St.")
  { person_firstname = "Somebody"
  , person_surname = "Somethingson"
  }

拡張機能を使用RecordWildCardsすると、入力の手間も省けますが、名前がわかりにくい短い定義にのみ使用することをお勧めします。

incrementId person@Person{..} = person { person_id = person_id + 1 }
于 2013-09-28T20:18:18.617 に答える
2

これを行う別の方法は、レンズパッケージのレンズを使用することです。

{-# LANGUAGE TemplateHaskell #-}

import Control.Lens

data Person  = Person {
    _person_id :: Int,
    _person_firstname :: String,
    _person_surname :: String,
    _person_address :: String
}

makeLenses ''Person

examplePerson = Person 7 "aaa" "bbb" "ccc"

modifiedPerson = set person_firstname "zzz" examplePerson

main :: IO ()
main = do
    putStrLn $ view person_firstname modifiedPerson

レンズには、簡単に構成できるという利点があります。ネストされたデータ構造がある場合に便利です。

于 2013-09-28T21:52:32.517 に答える