7.9 YesとNoの型クラス
- 様々な型の真理値判定を可能とするためのYesNo型を宣言せよ。
- 1.に関して、0は偽、それ以外は真と解釈するように数に関してのインスタンスを定義せよ。
- 空リストは偽、そうでなければ真とするようにリストに関してのインスタンスを定義せよ。
- 3.のインスタンス宣言について、
[a]
の部分を同じ意味で別の表記に変更することが出来る。どのように変えればよいか。
Bool
のインスタンスを定義せよ。
- 5.で用いた
id
とは何か。
Maybe a
のインスタンスを定義せよ。
- YesNo値をとり、好きな型の値の2つのうち1つを返す関数yesNoIfを定義せよ。
解答
1.
class YesNo a where
yesno :: a -> Bool
instance YesNo Int where
yesno 0 = False
yesno _ = True
instance YesNo [a] where
yesno [] = False
yesno _ = True
- 型名
[a]
は[] a
と書けるので、Maybe a
などのように、([] a)
と書くことが出来る。
instance YesNo Bool where
yesno = id
- 引数を1つ取って同じものを返す標準ライブラリ関数
instance YesNo (Maybe a) where
yesno (Just _) = True
yesno Nothing = False
yesnoIf :: (YesNo y) => y -> a -> a -> a
yesnoIf yesnoVal yesResult noResult =
if yesno yesnoVal
then yesResult
else noResult