Haskell-ユーザ定義型
代数的型宣言 (algebraic datatype declarations)
ユーザが新しく型を定義したい場合には、代数的型宣言として「data」キーワードを用いて宣言します。
型構築子の値はデータ構築子のいずれかであることを示しています。
data 型構築子(type constructor) = データ構築子(data constructor) ...
以下のようにデータを定義することができます。
data Switch = On | Off
data Day = Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday
四則演算の式を表す代数データ型Exprは以下のように表現します。
#!/usr/bin/env runghc
data Expr = C Int | Add Expr Expr | Sub Expr Expr
| Mul Expr Expr | Div Expr Expr deriving Show
evaluate :: Expr -> Int
evaluate (C x) = x
evaluate (Add e1 e2) = evaluate e1 + evaluate e2
evaluate (Sub e1 e2) = evaluate e1 - evaluate e2
evaluate (Mul e1 e2) = evaluate e1 * evaluate e2
evaluate (Div e1 e2) = evaluate e1 `div` evaluate e2
main = print $ evaluate(Add (C 2) (C 3))
構造体データの作成
dataキーワード(データ構築子)を使用して、自分でデータ型を定義することが出来ます。
例えば、構造体を作成したい場合、以下のようにします。
#!/usr/bin/env runghc
data MyStruct = MyStruct {
intVal :: Int,
strVal :: String
}
-- 構造体への代入
set_val :: Int->String->MyStruct
set_val i s = MyStruct i s
-- 数値の取得
get_intval :: MyStruct->Int
get_intval m = intVal m
-- 文字列の取得
get_strval :: MyStruct->String
get_strval m = strVal m
main = print(get_strval(set_val 5 "message"))
型シノニム (type synonym)
type宣言 (type declarations)
型シノニムとは、既存のデータ型に別名をつけるというものです。
C言語におけるtypedefのようなものであり、単に型に別名を付けるのみです。
型シノニムを宣言するには「type」宣言を使います
例えば、Stringは[Char]の別名です。
type String = [Char]
newtype宣言
newtype宣言は「新しい型」を宣言します。
実体は既存の型と同一であるが、元の型とは違う扱いをする場合に用います。
newtype Funcname = Funcname String