Haskell~教養としての関数型プログラミング~から学ぶ
第5章 関数
関数リテラル
- 関数を変数に保存せずにその場で使うことができる
*Main> (\x -> x ^ x) 3
27
*Main> (\x n -> x ^ n) 3 2
9
高階関数
関数を引数にとり関数を返す
twice.hs
-- 引数(関数)に引数xを適用した結果を関数fに適用する高階関数
twice = \f x-> f (f x)
-- 関数を3回適用する関数
thrice = \f x -> f (f ( f x))
- 高階関数を使用
# ひとつ前の値を返す
*Main> pred 8
7
# 次の値を返す
*Main> succ 8
9
# 高階関数twiceにsucc関数を渡す
*Main> twice succ 8
10
# 高階関数twiceにpred 関数を渡す
*Main> twice pred 10
8
演算子と関数
- 演算子を()で囲むと関数になる
*Main> 5 + 5
10
*Main> (+) 5 5
10
*Main> (*) 5 5
25
- 関数をバッククォートで囲むと演算子になる
つまり、関数をバッククォートで囲むことで演算子として利用することができる
*Main> mod 10 8
2
*Main> 10 `mod` 8
2
- 演算子(関数)の部分適用
# 3 ^ 2に等しい
*Main> (^2) 3
9
# 2 ^ 3 に等しい
*Main> (2^) 3
8
# mod 8 10に等しい
*Main> (mod 8) 10
8
# mod 10 8に等しい
*Main> (mod 10) 8
2
# 10 `mod' 8 に等しい
*Main> (`mod` 8) 10
2
# 10 `mod` 8に等しい
*Main> (10 `mod`) 8
2
カスタム演算子を定義
- 独自の演算子を定義することができる
カスタム演算子で使える記号
!#$%&+-./<=>?@\^|~:
ただし:
は演算子の先頭文字では使用できない
func.hs
-- カスタム演算子 引数x, y を2乗してから加算する演算子
x *+ y = x ^ 2 + y ^ 2
-- カスタム演算子 金額x, 税率y を与えると税込み後の金額を返す演算子/*/を定義
x /*/ y = x + div (x * y) 100
# カスタム演算子 引数x, y を2乗してから加算する演算子を使用してみる
*Main> 2 *+ 3
13
このことから演算子は中置記法で書く引数を2つとる関数であると捉えることができる。
演算子は()を使うことで関数に、関数はダブルクォーテーションを使うことで演算子に変換できる。
振り返り
高階関数とか関数の部分適用はカッコいいなって思ってたヤツなんでこの本を読み終わるころには自然と使いこなせるようになっていたい。
カスタム演算子も面白い。カスタム演算子を使わなくても関数でこと足りるけど。
次はいよいよMaybe値の学び。
これってMaybeモナドのことであってるよね?