今回はセレクタについて。
フィールドラベルを使って代数的データ型を宣言すると、フィールドラベルと同名の関数が自動的に宣言されて、フィールドの値を取得できるとのことです。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
というようにコンパイルエラーになってしまいました。