2009-11-26 14 views

答えて

19

次の2つの状況でレコード構文を使用する必要があります。

  1. タイプは型宣言がその意図したレイアウト

についての手掛かりを与えない

  • 多くのフィールドがあります例えばポイントタイプが可能

    data Point = Point Int Int deriving (Show) 
    

    最初のIn tはx座標を示し、第2はyを示しています。しかし、次の型宣言の場合は、(Learn You a Haskell for Great Goodから取られた)異なっている:

    data Person = Person String String Int Float String String deriving (Show) 
    

    意図タイプのレイアウトは次のとおりです。名、姓、年齢、身長、電話番号、好きなアイスクリームのフレーバー。しかし、これは上記の宣言では明らかではありません。レコード構文は便利ここに来る:

    data Person = Person { firstName :: String 
            , lastName :: String 
            , age :: Int 
            , height :: Float 
            , phoneNumber :: String 
            , flavor :: String 
            } deriving (Show) 
    

    レコード構文は、コードをより読みやすく、かつ自動的に私たちのために、すべてのアクセサ関数を定義することによりタイピングを大量に保存されました!

  • +2

    また、 'StateState'モナドにはレコード構文の面白い使い方があります。ここで' runState'は文法的な巧妙さのビットとして使われます。 – jberryman

    +1

    あなたはフロート= タイプのPhoneNumber =文字列 タイプのフレーバー=文字列 データ人=人姓を 'タイプのFirstName =文字列 タイプのLastName =文字列 タイプ年齢=のInt タイプの高さのような型システムと使用タイプエイリアシングを活用でき姓名年齢身長PhoneNumber派生(表示) あなたの議論は無効です。 – yaccz

    6

    複雑なマルチフィールドデータに加えて、newtypeはレコード構文で定義されることがよくあります。いずれの場合でも、レコード構文を使用することには実質的にマイナス面はありませんが、合計型の場合、レコードアクセサーは通常意味がありません。たとえば:

    data Either a b = Left { getLeft :: a } | Right { getRight :: b } 
    

    は有効ですが、アクセサ関数は部分ある - getLeft (Right "banana")を書くとエラーになります。そのため、そのようなアクセサーは一般的には落胆している。 getLeft :: Either a b -> Maybe aのようなものが一般的になり、手動で定義する必要があります。しかし、アクセサは名前を共有できることに注意してください:tastinessmagic両方はまだありませんが、今

    data Item = Food { description :: String, tastiness :: Integer } 
        | Wand { description :: String, magic :: Integer } 
    

    descriptionは、合計です。

    関連する問題