10000hの技術メモ

この先生きのこるための勉強内容&時間記録

Haskell入門 2.4 〜 3.2

Haskell入門 関数型プログラミング言語の基礎と実践

Haskell入門 関数型プログラミング言語の基礎と実践

2.4 関数

関数呼び出しは

関数 引数

の形で呼んでいた。

関数定義は

関数 引数 = 式

の形で行う。

> incr n = n + 1 :: Int

ラムダ式を書く場合

> (¥n -> n + 1 :: Int)

カリー化

カリー化(currying)とは、多引数の関数を関数を返す関数として表現することです。

はい。

. による関数合成

f . g = ¥x -> f (g x)

ここで

f . g と合成すると、引数に対してまずgを適用して、次にその返り値にfを適用する関数になります

とあるけれど、関数適用って値を関数に適用するんじゃなかったっけ?(うろおぼえ)

ラムダ計算 - Wikipedia

遅延評価と非正格性

多くのプログラミング言語:関数を呼び出す前に引数の式を計算する=先行評価 Haskell:遅延評価

引数に⊥を渡したときに結果が⊥になるような関数を正格な関数(strict function)と言う。 ⊥を渡しても結果が⊥とはならない関数を非正格な関数(non-strict function)と言う。

書き方によって評価順序の制御をがんばることも可能。

main関数とdo式

はい。

・・・2章、読んでいるだけだとあまりスっと入ってこないので、一度飛ばして先に進んで、サンプルコードを読み書きしていて詰まったら戻ってくることにする。

3章へ進む。

3.2 型システム

式に型を割り当てて、正しく組み立てられているか確かめる仕組みのこと

型チェック

型付け規則に従っているかどうかをチェックする。このおかげで、静的型付き言語では炊かに起因する問題がおきない

多様性

任意の型の値に対して適用できる関数sample

*Main Lib> sample x = x
*Main Lib> :t x
x :: Num t => t
*Main Lib> sample2Params f x = f x
*Main Lib> :t sample2Params
sample2Params :: (t1 -> t) -> t1 -> t

tは汎用の型を表す型変数で、複数の具体的な型で利用できるようにした型システムはパラメータ多相(parametric polymorphism)を持つという。

アドホック多相

オブジェクト思考で言うオーバーロード。渡す値の型によって違う動きをする。

型推論(type inference)

処理系が自動で型を付けてくれる。

Haskellの型システムはHindley-Milnerの型システムを基にしている。

Hindley–Milner type system - Wikipedia

今回の勉強時間 1時間 累計勉強時間 20時間58分