関数プログラミング入門 -Haskellで学ぶ原理と技法- ①

1.1まとめ

スクリプトとはプログラマが提供する定義の集まり
定義は式間の等式 型シグネチャを用いる
練習問題 1.1

--requirements
square ::  Float -> Float
square x = x * x
--ex 1.1.1
quad :: Float -> Float
quad x = square (square (x))
--ex1.1.2
greater :: (Integer,Integer) -> Integer
greater (x,y) = if x<=y then y else x
--ex1.1.3
circleArea :: Float -> Float
circleArea r = (square (r)) * (22/7) 

1.2まとめ

評価は単純化、簡約ともいう。要は最も単純な形式にすること
練習問題1.2
ex 1.2.1
停止しない。先にx,yを簡約することになっているが、これはinfinityの定義より終わらない。
ex 1.2.2
3つ。前述の例に加え、7*(3+4)→7*3 + 7*4 という簡約系列がある。
ex 1.2.3
直感的にはあらゆるパターンがzeroになるように思える
簡約規則の適応パターン数はちょっとわからない
停止性の証明については、式のサイズを、succ,predの合計数と定義すれば一回何かを評価するたびに必ず一つはサイズが小さくなると言える?
ex 1.2.4
例えば三通り?単純だけど。
ループしそうだから静止性に対しては疑問が残るけど…
ex 1.2.5
うーむ

1.3まとめ

定義されない値を表す⊥という記号を導入。f⊥=⊥となるfを正格関数、そうじゃないやつを非正格関数という。遅延評価戦略なら非正格関数を評価できるがけど、それ以外だと無理(⊥の所も最初に評価してしまうからかなぁ)。
ex 1.3.1
遅延評価ならx==0の段階でyは評価されないから0が返る。後者だと先にinfinityが来てるから残念な感じになる。
ex 1.3.2
f,gが正格よりg ⊥ = ⊥ で f ( g x) = f ⊥ = ⊥で f,gならhも正格。

1.4まとめ

f x = g xの原理を外延性の原理という。中で何やってるかは関係なくて引数と返り値によって等価性が定められる。
f x = g x …連用的証明 または ポイントワイズスタイルの証明
f = gを直接照明 ポイントフリースタイル
カリー化……引数を一つ取って関数を返すようにする仕組み。

--これだと普通に二2引数取って和を返す
plus :: (Integer,Integer) -> Integer
plus (x,y) = x + y

--カリー化を(意識して)やるとこんな感じ
plusc :: Integer -> (Integer -> Integer)
plus x y = x + y
--これだと、まずひとつの引数をとって「一つの引数を取って最初の引数と足した値を返す」を返して、次にその関数をもう一つの引数に適用している。

カリー化するとカッコが減ったり部分適用して便利な関数が使えるようになったり。
カリー化されてない関数をカリー化する関数
curry :: ((a,b) -> y) -> (a -> b -> y)
curry f x y = f (x,y)
uncurry関数は演習問題で。
中置記法を使って書く関数を演算子と呼ぶ。``で囲めばいい。
二項演算子の片方を適用して通常の前置関数にするという仕組みをセクションという。わかりやすい。
→は右結合。結合性を持つ演算子だったらどっちでもよい。
合成関数も扱える。