2016-04-03 6 views
0

私はデータベースにSQLテーブルを表す多くの "データ"を持っています。フィールドの同じ種類と名前を持つすべての "データ"定義を単純にする方法はありますか?

data User = User { userId :: Int, userName :: String } 
    data Article = Article { articleId :: Int, articleTitle :: String, articleBody :: String } 
-- ....... 

これらのすべてのフィールドには、主キーとしての「id」フィールドがあります。私は、それぞれの "データ"ごとにそれを定義する必要性を取り除く方法があるのだろうと思っています。これを行う場合:

class DataTable a where 
    myId :: Int 

それは何も変更されませんか?私はまだ各データの "id"を定義し、それをDataTable用に実装する必要があります。実際はもっと複雑になります。

答えて

3

時には物を分けるのが一番です。

data Identified a = Identified 
    { ident :: !Int 
    , payload :: a } 

これで、識別されたものは完全に統一された方法で処理できます。

+0

私のケースにどのように適用できますか? –

2

GHC 8.0でDuplicateRecordFieldsを使用すると、多くのデータ型で同じレコードフィールド名を使用できます。これは、OverloadedRecordFieldsという大きな機能の一部です。

第3部MagicClassesは、HasFieldおよびUpdateFieldの誘導型クラスを導入しています。これはあなたのDataTableと似ています。

データ型にフィールドが必要な場合は、データ型定義でフィールドを宣言する必要があります。私はTemplate Haskell以外の拡張子を認識していないので、これを変更します。

+0

私は 'DuplicateRecordFields'はユーザーが求めているのとは異なる問題を解決すると思います。 (私はそれについて学ぶことがうれしいですが!) – chepner

関連する問題