top page > computer > haskell > web_lecture > for_programmer > boollike_complex_types.html
更新日:
文責: 重城良国

複合的な型を型クラスBoolLikeのインスタンスにする

(工事中 90%)

boolLike.hs

はじめに

リスト型やMaybe型などの複合的な型を型クラスのインスタンスにする。

Maybe型

Maybe型においてはNothingだけが偽とされる。

instance BoolLike (Maybe a) where
toBool Nothing = False
toBool _ = True

このように型引数を持つ型においては型引数の部分に型変数をおくことで型クラスのインスタンスにできる。

% ghci boolLike.hs
*Main> iff Nothing "Nothing is true." "Nothing is false."
"Nothing is false."
*Main> iff (Just 8) "Just 8 is true." "Just 8 is false."
"Just 8 is true."

リスト型

文字列を含むリスト型について型クラスBoolLikeのインスタンスにする。問題は"\0"や"0"を偽とする必要があるということだ。より一般的に

ときにリスト全体としても偽とするようにルールを拡張する。このときリストの要素も型クラスBoolLikeのインスタンスでなければならない。インスタンス宣言に型制約をつける。

instance BoolLike a => BoolLike [a] where
toBool [] = False
toBool [x] = toBool x
toBool _ = True

空リストならFalse、要素がひとつでその要素が偽ならばFalse、それ以外はTrueだ。

*Main> iff "0" "\"0\" is true." "\"0\" is false."
"\"0\" is false."
*Main> iff "" "\"\" is true." "\"\" is false."
"\"\" is false."
*Main> iff [[]] "[[]] is true." "[[]] is false."
"[[]] is false."
*Main> iff [15] "[15] is true." "[15] is false."
"[15] is true."

構文

型引数をとる型は型引数の部分に型変数をおくことで型クラスのインスタンスにできる。

instance 型クラス名 (型構築子名 型変数1 型変数2 ...) where
...

型引数部の型変数に関して型クラス制約をつけることができる。

instance 型制約 => 型クラス名 (型構築子名 型変数1 型変数2 ...) where
...

まとめ

型引数をとる型は型引数の部分に型変数をおき全体として型クラスのインスタンスにできる。型引数の部分におかれる型変数に対してクラス制約もつけられる。

「アドホック多相関数iff」へもどる 「構文: newtype」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics