Haskellおべんきょメモ
地道に進めてる
型
- 型はすべて大文字で
- 関数は小文字かアンダーバー(_)で始める
type1.hs
--myName(私の名前)をString型で宣言する
myName :: String
myName = "nekoGorilla"
--年齢を表す
myAge :: Int
myAge = 23
--タプルも使えば色んな情報詰め込める
myAddress :: (String, String, String)
myAddress = ("日本", "東京都", "杉並区")
関数の型
- 関数にも型を定義する
- 引数の型が一つとは限らないため、型変数を利用することもある
type2.hs
--引数をそのまま返す関数
returnArg :: String -> String
returnArg x = x
--しかし↑のままではString型しか返せない(返すだけなら型はなんでもいい)
--型変数を利用することで、aは何らかの型になる
returnArg :: a -> a
returnArg x = x
--100を渡した場合
returnArg 100
--aはHaskellの型推論によりInt型だと解釈される
returnArg :: a -> a
--↓
returnArg :: Int -> Int
型を定義する
- 一つの型に対して別名を使用することを型シノニムという
- 型シノニムを定義する際には
type
キーワードを使う
type3.hs
--自分の情報から簡単なプロフィールを作る関数
--引数に名前・あだ名・出身地・年齢・血液型を設定する
makeProf :: String -> String -> String -> Int -> String-> String
makeProf name nickName birthPlace age bloodType = "名前: " ++ name ++ " あだ名: " ++ nickName ++ " 出身: " ++ birthPlace ++ " 年齢: " ++ show age ++ " 血液型: " ++ bloodType
putStr (makeProf "nekoGorilla" "ゴリラ" "ジャングル" 23 "O")
名前: nekoGorilla あだ名: ゴリラ 出身: ジャングル 年齢: 23 血液型: O
--ただし引数を見ただけではどんな情報を受け取る関数なのかが分からない
makeProf :: String -> String -> String -> Int -> String-> String
--そこで型の定義をする
type Name = String
type NickName = String
type BirthPlace = String
type Age = Int
type BloodType = String
--定義した型に置き換えてみると…
makeProf :: Name -> NickName -> BirthPlace -> Age -> BloodType-> String
--どんな情報を引数として受け取る関数なのかが一目で分かるようになった!
独自の型を定義
-
data
を使い、独自の型を定義できる - 型シノニムとの使い分けには注意する
type4.hs
{-
独自の型: Direction型
Directionは型コンストラクタ
North | Est | South | Westはデータコンストラクタ
-}
data Direction = North | Est | South | West
--Direction型を受け取り、Direction型が東西南北どのインスタンスかで戻り値が決まる
direction :: Direction -> String
direction North = "北"
direction Est = "東"
direction South = "南"
direction West = "西"
--Estを受けとると
putStr (direction Est)
東
今日の感想
まだ楽しめていると思う
そろそろややこしくなってきそうだけども…