H本を読む: Part 2

この記事は PMOB Advent Calendar 2015 - Adventar の 16 日目の記事です.

前: 0-1ナップザック問題解いた - あさた研メモ

次: LuCielNoblesse - まともな記事書く方に1ルピー賭ける

前回のつづきです.

データ型

車をつくろう

data Car = Car { company :: String
               , model :: String
               , year :: Int
               } deriving (Show)

できた.

使うときは

let kuruma = Car {company = "Porushe", model = "Koukyu", year = 1967} 
-- 色々と適当

みたいな

型Carに対しての処理の記述

dataStrCar :: Car -> String
dataStrCar (Car { company = c, model = m, year = y}) = 
    "会社: " ++ c ++ ", モデル: " ++ m ++ ", 年: " ++ y

dataStrCar kuruma

みたいな感じで呼び出し

コンストラクタ

型を引数に取って新たな型を作るもの

例:

data Maybe a = Nothing | Just a
-- これからMaybe IntとかMaybe Charとかが生まれる

使うときには,大抵は明示的に型を渡さなくても推論してくれるっぽい. すごい.

例: 三次元ベクトル

Vector a = Vector a a a deriving (Show)

mul :: (Num a) => Vector a -> a -> Vector a
(Vector x y z) 'mul' m = Vector (x*m) (y*m) (z*m)

みたいな.

Verctor a a a -> HogeとかじゃなくてVector a -> Hogeってなことに注意.

Vector a で一つの型になるんやでって話

型クラス =/= 僕の知ってるクラス

全然ちゃうやん...

型クラスはインターフェイスのようなもの.特定の振る舞いを定義する.

とりあえず頭空っぽにして読んでみたらあっふーんってなった.

Functor?なにそれ

いやいや,Wikiみて分かるなら苦労してないんだよ...

Functor型クラスについてみると,

class Functor f where
    fmap :: (a -> b) -> f a -> a b

いわく

ファンクターになれるのは箱のような働きをする型

だそうな.

だからMaybeとかListとかもファンクタなんだって(合ってる?).

自分の認識では「mapやらfmapでいじれるようなヤーツのこと」って思っちゃってるけど,

もっとよまなきゃなァ

はい.読みきれませんでした...

しかーしとてもおもしろい!!!!!

僕は Java入門 -> Scala入門 (チョットだけLispさわり) -> FPScala (を途中までで挫折)

-> すごいH本

とガタガタ道を進んできたけど,H本を読んでで見通しが広くなっていくのを感じる.

今の僕に合ってると思うのでこれからも読もうと思うから,

一応読みきるまではBlogを上げていこうかな.