morioXのCraftお勉強日記 RSSフィード

2006-12-28

[] Basic types and definitions (1日目)  Basic types and definitions (1日目) - morioXのCraftお勉強日記 を含むブックマーク

3.1 The Booleans: Bool

Boolean型(true, false)と、Boolean型を扱う演算子(&&, ||, not)の定義。EORを自分で定義する方法も紹介されている。

exOr :: Bool -> Bool -> Bool

exOr x y = (x || y) && not (x && y)

実際は /= 記号(Not Equalのこと。Javaでは「!=」)は、EORと同じだよね、という説明を読んではっとした。== は、結局ANDを取る二項演算子で、!= は、EORを取る二項演算子だったということか。

せっかくなので、Prelude.hsでの定義を調べてみる。まず呼出しコマンドを入力(EDITOR環境変数は、とりあえずvimで)。

Type :? for help

Hugs> :find /=

で、Prelude.hsが表示されるので、/==コマンドで検索すると以下に到着。

class Eq a where

  (==), (/=) :: a -> a -> Bool

  -- Minimal complete definition: (==) or (/=)

  x == y = not (x/=y)

  x /= y = not (x==y)

でも、これだと結果が不定になるなあ(結局==はTrueになるのかFalseになるのか分からない)。他に定義している場所でもあるのかな。

セクションの最後の方では、パラメータの値によって式を使い分けする方法について書いてある。not演算子を自分で定義する例で説明している。

myNot :: Bool -> Bool

myNot True = False

myNot False = True

mr_konnmr_konn2006/12/29 10:13確かEqクラスはインスタンス定義の時に(==)か(/=)のどちらか一方を上書き定義すればいいようにこのような定義になっているので、BoolをEqのインスタンスと宣言する時にどちらか一方が上書きされているはずです。

morioXmorioX2006/12/30 19:31なるほど。御指摘ありがとうございます。参考になります。

型クラス周辺についての理解が足りないなあ・・・、と思い、「ふつける」を読み直した所、こっちのP.241にもEqクラスの説明が書いてありました。
読んだはずなのに、なんで忘れちゃったんだろう・・・orz

Eqクラスのインスタンスで(==)と(/=)の両方を実装しないと、無限ループになるため、上書き定義が必要、ということも書いてありました。たしかにそう考えると筋が通りますね。

>BoolをEqのインスタンスと宣言する時にどちらか一方が上書きされているはずです。
との御指摘については、12/30のエントリでもう少し詳しく触れてみます。

RyanRyan2012/10/03 00:42Cheers pal. I do appreciate the witring.

oixiezowcuoixiezowcu2012/10/03 19:26Y2vHpS <a href="http://gwgkxieblkal.com/">gwgkxieblkal</a>

vgmeeqmpivgmeeqmpi2012/10/04 00:06BnOcSM , [url=http://agcdyopjdawa.com/]agcdyopjdawa[/url], [link=http://srgsewyxvcmj.com/]srgsewyxvcmj[/link], http://czgbxcytslsv.com/

xfdaamnxfdaamn2012/10/04 12:50inHiPt <a href="http://tusaxhiovjka.com/">tusaxhiovjka</a>

kjdoywgujkjdoywguj2012/10/06 13:57cbPbty , [url=http://ovnzkiytxztn.com/]ovnzkiytxztn[/url], [link=http://nheltbioqugi.com/]nheltbioqugi[/link], http://agruamrxcdum.com/