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

関連ページ