『プログラミングHaskell』の10章を読みました。
第10章 型とクラスの定義
どの章にも長い例題(実際はあんまり長くありません)がありますが,本章では,「恒真式検査」と「仮想マシン」を作成します。
恒真式とは,常に真となる命題のことで,
は,常に真となりますので,恒真式ですが,
は,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 bchap10q8.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