kenkovlog

けんこふたんっオフィシャユブヨグッ
アンッ!アンッ!アンッ!アンッ!

Data class in Haskell

プログラミングする上でラベルと値の組を扱うことはよくあることです。 例えば、Python ではbuit-in のデータ型としてディクショナリが提供されています。

Haskell にはPythonのディクショナリのようなbuilt-in のデータ型はありません。 しかし、安直に[(String, String)] の型のデータとして与えたり、 本物のプログラマはHaskell を使う に書かれているようにMap を使ったりすれば可能となります。

もう一つの方法としてデータ型を定義する方法があります。 例えばこのように。

{-# LANGUAGE DeriveDataTypeable #-}
data User = User { username :: String
                 , usertitle :: String
                 , age :: Int
                 } deriving (Read, Show, Typeable, Data)

データ型を定義すると、型としてUser を使用できたり、 またパターンマッチにより内容を取りだせたりするなどの利点があります。

このデータ型を一般的に扱うためのクラスがData です。 上記のデータ型でもderiving を使ってData クラスのインスタンスとなるよう 自動導出しています。

警告

この自動導出は DeriveDataTypable プラグマを使用しないとエラーが出ます。

詳しくは、 stack overflow のページを参照してください。

Data クラスのインスタンスとすると次のようなことが可能になります。

import Data.Generics.Text (gshow)
import Data.Data

introspectData :: (Data a) => a -> [(String, String)]
introspectData d = zip fields $ gmapQ gshow d
    where
        fields = constrFields $ toConstr d

この例では、Data のコンストラクタのフィールド名と値の組のペアのリスト を返す関数を定義しています。

より詳細は Haskell and Web Applications のページを参照してください。

けんこふたん