LYH 7.9 YesとNoの型クラス

7.9 YesとNoの型クラス

  1. 様々な型の真理値判定を可能とするためのYesNo型を宣言せよ。
  2. 1.に関して、0は偽、それ以外は真と解釈するように数に関してのインスタンスを定義せよ。
  3. 空リストは偽、そうでなければ真とするようにリストに関してのインスタンスを定義せよ。
  4. 3.のインスタンス宣言について、[a]の部分を同じ意味で別の表記に変更することが出来る。どのように変えればよいか。
  5. Boolインスタンスを定義せよ。
  6. 5.で用いたidとは何か。
  7. Maybe aインスタンスを定義せよ。
  8. YesNo値をとり、好きな型の値の2つのうち1つを返す関数yesNoIfを定義せよ。

解答

1.

class YesNo a where
    yesno :: a -> Bool    -- a は具体型
instance YesNo Int where
    yesno 0 = False
    yesno _ = True
instance YesNo [a] where
    yesno [] = False
    yesno _ = True
  1. 型名[a][] aと書けるので、Maybe aなどのように、([] a)と書くことが出来る。
instance YesNo Bool where
    yesno = id
  1. 引数を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