独自のアクセサ関数を記述する必要があるのと比べて、レコード構文が非常に便利です。通常のデータ宣言構文よりもレコード構文を使用するのが最善の場合については誰もガイドラインを見たことがないので、ここで尋ねます。Haskellのデータ宣言にはいつレコード構文を使うべきですか?
16
A
答えて
19
次の2つの状況でレコード構文を使用する必要があります。
- タイプは型宣言がその意図したレイアウト
についての手掛かりを与えない
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)
レコード構文は、コードをより読みやすく、かつ自動的に私たちのために、すべてのアクセサ関数を定義することによりタイピングを大量に保存されました!
6
複雑なマルチフィールドデータに加えて、newtype
はレコード構文で定義されることがよくあります。いずれの場合でも、レコード構文を使用することには実質的にマイナス面はありませんが、合計型の場合、レコードアクセサーは通常意味がありません。たとえば:
data Either a b = Left { getLeft :: a } | Right { getRight :: b }
は有効ですが、アクセサ関数は部分ある - getLeft (Right "banana")
を書くとエラーになります。そのため、そのようなアクセサーは一般的には落胆している。 getLeft :: Either a b -> Maybe a
のようなものが一般的になり、手動で定義する必要があります。しかし、アクセサは名前を共有できることに注意してください:tastiness
とmagic
両方はまだありませんが、今
data Item = Food { description :: String, tastiness :: Integer }
| Wand { description :: String, magic :: Integer }
description
は、合計です。
関連する問題
- 1. Haskell - データの宣言/使用
- 2. 型宣言構文haskellとhaskellのような言語の違い
- 3. レコード構文を使用して制約付きデータ型を宣言できますか?
- 4. haskell構文の混乱 - 関数型宣言
- 5. Haskell:データ型の複数宣言
- 6. pylonsに宣言構文を持つrepoze.whatを使用する
- 7. Haskellの型宣言
- 8. Haskellの型宣言
- 9. c#配列宣言構文vs C++配列宣言構文
- 10. C#では、いつ構造体を使うべきですか?クラスはいつ使うべきですか?
- 11. 操作を伴うHaskellデータ型構文
- 12. STモナド宣言の構文
- 13. 経路の宣言構文
- 14. RLMArrayプロパティ宣言の構文
- 15. Haskellのデータ宣言を型の値でバインドすることができます
- 16. バイナリネットワークパケット構造をHaskellの標準データ型(レコード)にマップするにはどうしたらいいですか?
- 17. 前方宣言:構文エラー
- 18. mysqlの構文を宣言します
- 19. $(...)と[|テンプレートのHaskell関数を使うときは... |]構文ですか?
- 20. Javaで定数階層データ構造を宣言するには?
- 21. モジュールの宣言とエクスポートはどのように行うべきですか?
- 22. C++フォワード宣言を使用すべきですか?
- 23. クラスフィールドはC++でどのように宣言されるべきですか?
- 24. 関数宣言のリストパターンの構文
- 25. haskellで同じ変数を含む2つのデータ型を宣言するには?
- 26. setUpClassはいつ使うべきですか?__init__を使うべきですか?
- 27. Switch宣言で型宣言を行うことはできますか?
- 28. 多言語の全文:どのステミング[スノーボール]言語を使うべきですか?
- 29. 宣言構造の違い
- 30. verilog 2001の構文ではグローバル宣言が不正です。タスク
また、 'StateState'モナドにはレコード構文の面白い使い方があります。ここで' runState'は文法的な巧妙さのビットとして使われます。 – jberryman
あなたはフロート= タイプのPhoneNumber =文字列 タイプのフレーバー=文字列 データ人=人姓を 'タイプのFirstName =文字列 タイプのLastName =文字列 タイプ年齢=のInt タイプの高さのような型システムと使用タイプエイリアシングを活用でき姓名年齢身長PhoneNumber派生(表示) あなたの議論は無効です。 – yaccz