代数的データ型その5

今回はセレクタについて。

フィールドラベルを使って代数的データ型を宣言すると、フィールドラベルと同名の関数が自動的に宣言されて、フィールドの値を取得できるとのことです。id:MAS3:20071124#c1195912479のコメントでも使われていました。

それでは早速セレクタを使ってこれまでのプログラムを書き直してみます。

data Anchor = A { aUrl   :: String,
                  aLabel :: String }

main = do putStrLn $ "Url  : " ++ aUrl getAnchor
          putStrLn $ "Label: " ++ aLabel getAnchor

getAnchor :: Anchor
getAnchor = A "http://www.example.com" "Example"

気になったのは、同名のセレクタがある時はどうなるか。こんなプログラムを作ってみました。

data Anchor = A { aUrl   :: String,
                  aLabel :: String }

data Anchor2 = A2 { aUrl   :: String,
                    aLabel :: String }

main = do putStrLn $ "Url  : " ++ aUrl getAnchor
          putStrLn $ "Label: " ++ aLabel getAnchor

getAnchor :: Anchor
getAnchor = A "http://www.example.com" "Example"

どうなったかというと、

selector_access.hs:4:20:
    Multiple declarations of `Main.aUrl'
    Declared at: selector_access.hs:1:18
                 selector_access.hs:4:20

selector_access.hs:5:20:
    Multiple declarations of `Main.aLabel
    Declared at: selector_access.hs:2:18
                 selector_access.hs:5:20

というようにコンパイルエラーになってしまいました。