Haskell その6
ゆっくり学んでおります。
ガード
f_positive1 n | n > 0 = True | otherwise = False f_positive2_NG n | otherwise = False | n > 0 = True f_positive3_NG n | n > 0 = True f_positive3_NG _ = False
上から下へ評価されるのでf_positive2_NGは全てFalseになる。
まさにガードしている感じ。
quicksort [] = [] quicksort (x:xs) = quicksort [y | y <- xs, y<x ] ++ [x] ++ quicksort [y | y <- xs, y>=x]
リスト内包表現中のブール式もガードと呼ばれる。
ならば、
[y | y < x <- xs ]
って書くほうが良くない?
…すいません、今は修行の身。
守離破の原則は守りましょうw
ユーザ定義型
data Mono = White | Black | Gray Int gray White = 0 gray Black = 100 gray (Gray n) = n isWhite m = (gray m) == 0 isBlack m = (gray m) == 100 isGray White = False isGray Black = False isGray _ = True
やっと出ました、ユーザ定義型。
型Monoは無引数の型構築子、White、Blackは無引数のデータ構築子、Grayは引数ありのデータ構築子、と読む。
Gray以外を見ると、単なる列挙型。
命令型言語に慣れ親しんだ者としては、ユーザ定義型っていうと、構造体とかクラスとかを思い出すけど、
Haskellの説明の多くが列挙型から始まるのはなぜだろう。
↓を見ると、Haskellではタプル型が類似していると言うが…。
http://www.sampou.org/haskell/tutorial-j/goodies.html
つぎにあげるのは、ひとつのデータ構築子のみからなる型の例です。
data Point a = Pt a a
単一の構築子から構成されているので、Pointのような型はしばしばタプル型(tuple type)と呼ばれます。
これは、本質的にはべつの型の直積(この場合は2引数)だからです。
(タプル型は別の言語ではレコード型と呼ばれているものに類似しています。)
一方、BoolやColorのような複数の構築子をもつ型は直和型((disjoint) union or sum type)と呼ばれます。
…。守離破、守離破。ナムナム…。
でも、やっぱこういうの↓見ると安心するの僕だけか?
data Person = Person {name, address::String, age::Int}
まぁ、いい、先を急ごう。
class
これはこちら↓のほうが理解しやすい。
http://www.geocities.jp/shido_takafumi/hs/haskell7.html
instance Eq Mono where m == m' = (gray m) == (gray m') instance Show Mono where show White = "White" show Black = "Black" show (Gray 0) = "White" show (Gray 100) = "Black" show (Gray n) = "Gray " ++ show n
EqやShowはCLOS(CommonLisp Object System)で有名(?)な総称関数。
Haskellで言うinstanceは、総称関数モデルで言うところのメソッド?
ググると、
みたいな説明も見かけたけど…うーん。
未知の概念を説明するのって難しい…。
一番分かり易かったのはやはりこの方の説明。
http://jp.rubyist.net/magazine/?0013-Legwork
さすがです。先輩。