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

アドホック多相関数iff

(工事中 90%)

boolLike.hs

関数iffは名前がよくないな。あとで変えよう。

はじめに

クラス関数を利用することでアドホック多相関数を定義することができる。

アドホック多相とは

アドホックとは「その場しのぎ」や「限定目的の」といった意味だ。アドホック多相ではそれぞれの型にそれ専用のクラス関数を定義することで多相性を実現する。それぞれの型に合わせたアドホックな関数ということだ。

アドホック多相関数iff

この関数の型宣言は真偽値として使う型を型bとして以下のように書ける。

iff :: b -> a -> a -> a

第1引数が真偽値、第2引数が真だったときの値、第3引数が偽だったときの値だ。真だったときの値と偽だったときの値と返り値は同じである必要がある。型bは何でもいいわけではない。型クラスBoolLikeのインスタンスでなければならない。

iff :: BoolLike b => b -> a -> a -> a

BoolLike b =>は型bが型クラスBoolLikeであるという制約を追加している。これが型クラス制約だ。これによって型bがtoBool :: b -> Boolを持つことが保証される。

iff b x y = if toBool b then x else y

% ghci boolLike.hs
*Main> iff 8 "8 is true." "8 is false."
"8 is true."
*Main> iff 0 "0 is true." "0 is false."
"0 is false."
*Main> iff '0' "'0' is true." "'0' is false."
"'0' is false."

構文

アドホック多相関数の型には先頭に型クラス制約

型クラス名 型変数 =>

をつける。

まとめ

クラス関数を利用するとアドホック多相関数を定義できる。アドホック多相関数の型には型クラス制約をつける。

課題

  1. リストからtrueとして扱われるものだけを取り出す関数truesを定義せよ
    • trues [8, 0, 2, 0, 0, 5, 5, 1]は[8, 2, 5, 5, 1]に
    • trues "abc01234\0"は"abc1234"になる

「基本的な型を型クラスBoolLikeのインスタンスにする」へもどる 「複合的な型を型クラスBoolLikeのインスタンスにする」へ

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