Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

13章分の10章

プログラミングHaskell』の10章を読みました。

第10章 型とクラスの定義

どの章にも長い例題(実際はあんまり長くありません)がありますが,本章では,「恒真式検査」と「仮想マシン」を作成します。
恒真式とは,常に真となる命題のことで,

  • (A\wedge B)\Rightarrow A

は,常に真となりますので,恒真式ですが,

  • A\Rightarrow (A\wedge B)

は,AがTrue, BがFalseのとき,Falseとなりますので,恒真式ではありません。ここで作る,プログラムは,恒真式であるかないかの検査を行ってくれるものです。実行結果は以下のようになります。

Main> isTaut (Imply (And (Var 'A') (Var 'B')) (Var 'A'))
True
Main> isTaut (Imply (Var 'A') (And (Var 'A') (Var 'B')))
False

真理値表を作成するための関数boolsでは再帰を用いているのですが,再帰の面白さを感じることができました。

Main> bools 2
[[False,False],[False,True],[True,False],[True,True]]

仮想マシンですが,書いてあることは理解出来ていると思います。例えば,式(2+3)+4がどのように評価されるか,自分で紙に書きだすことはできますが,eval,exec関数を自分で作るとなると自信がないです。言ってみれば,「レールの上を走ることはできるが,レールを敷くことはできない」という状態でしょうか。

疑問点など

練習問題8を入力してみたのですが,以下のようなエラーがでます。どういう意味なんでしょう?

  • chap10q8.hs
instance Monad Maybe where
    return :: a -> Maybe a
    return x = Just x

    (>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
    Nothing >>= _ = Nothing
    (Just x) >>= f = f x

instance Monad [] where
    return :: a -> [a]
    return x = [x]

    (>>=) :: [a] -> (a -> [b]) -> [b]
    xs >>= f = concat (map f xs)

$ ghci chap10q8.hs
GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main ( chap10q8.hs, interpreted )

chap10q8.hs:2:4: Misplaced type signature: return :: a -> Maybe a

chap10q8.hs:5:4:
Misplaced type signature:
>>= :: Maybe a -> (a -> Maybe b) -> Maybe b

chap10q8.hs:10:4: Misplaced type signature: return :: a -> [a]

chap10q8.hs:13:4:
Misplaced type signature: >>= :: [a] -> (a -> [b]) -> [b]
Failed, modules loaded: none.
Prelude>

追記(2009/12/29)

nさん,コメントをいただきありがとうございます。おかげで,理解を深めることができたと思います。
コメントを受けて,まず,

instance Monad Maybe where
    return x = Just x

    Nothing >>= _ = Nothing
    (Just x) >>= f = f x

としてみました。型クラスメソッドの型シグネチャをとってみました。すると,

chap10q8.hs:1:9:
Duplicate instance declarations:
instance Monad Maybe -- Defined at chap10q8.hs:1:9-19
instance Monad Maybe -- Defined in Data.Maybe

と表示されました。「Maybeは,Data.Maybeで定義されていて,ダブっているよ」となりましたので,今度は,以下のように変更することでエラーがなくなりました。

data MyMaybe a = MyNothing | MyJust a

instance Monad MyMaybe where
    return x = MyJust x

    MyNothing >>= _ = MyNothing
    (MyJust x) >>= f = f x