関数プログラミング入門・一人読書会 (4)
「関数プログラミング入門」の練習問題をやっていきます
今回は1.5.1〜1.5.2
1.5.1
フィボナッチ数を計算する関数fib
を定義する
fib :: Integer -> Integer fib n | n < 0 = error "fib: n must be >= 0" | n == 0 = 0 | n == 1 = 1 | otherwise = fib (n - 1) + fib (n - 2) main :: IO() main = putStrLn $ show $ (fib 20) == 6765
1.5.2
整数の絶対値を返す関数abs
を定義せよ
abs' :: Integer -> Integer abs' n | n < 0 = -n | otherwise = n main :: IO() main = do putStrLn $ show $ (abs' 0) == 0 putStrLn $ show $ (abs' 20) == 20 putStrLn $ show $ (abs' (-20)) == 20
- 作者: Richard Bird,山下伸夫
- 出版社/メーカー: オーム社
- 発売日: 2012/10/26
- メディア: 単行本(ソフトカバー)
- 購入: 3人 クリック: 28回
- この商品を含むブログ (5件) を見る
関数プログラミング入門・一人読書会 (3)
「関数プログラミング入門」の練習問題をやっていきます
- 作者: Richard Bird,山下伸夫
- 出版社/メーカー: オーム社
- 発売日: 2012/10/26
- メディア: 単行本(ソフトカバー)
- 購入: 3人 クリック: 28回
- この商品を含むブログ (5件) を見る
今回は1.4.1〜1.4.7
1.4.1
hの型は,
h :: Integer -> Integer -> Integer
fとgの型は f :: Integer -> Integer
,g :: Integer -> (Integer -> Integer)
なので,(・)
の定義に照らすとf・g
は型が整合しない.これを考慮すると,正しいのは
h x = f・(g x)
である
1.4.2
delta
をカリー化した型は
delta :: Float -> Float -> Float -> Float
1.4.3
log' :: Float -> (Float -> Float)
1.4.4
関数の名前をInteg
とすると,まず積分される対象の関数の型は Float -> Float
.よって,
Integ :: (Float -> Float) -> Float -> Float -> Float
1.4.5
前者については,与えられた関数に0を適用して,その数にsquareを適用するような関数ZeroSquare
は,
let ZeroSquare f = square ( f 0 ) ZeroSquare :: (Integer -> Integer) -> Integer
後者は,本文中の twice
が例である
1.4.6
-x
はxの符号反転を示すので,3つ目は偽.また,+
と×
は交換法則が成り立つ.よって2つが真.
1.4.7
uncurry f (x, y) = f x y
curry (uncurry f) x y = curry ((x', y') -> f x' y') x y = ((x', y') -> f x' y') (x, y) = f x y uncurry (curry f) (x, y) = uncurry (x -> y -> f (x, y)) (x, y) = (x -> y -> f (x, y)) x y = f (x, y)
関数プログラミング入門・一人読書会 (2)
前回,読み始めたというエントリを書いて,その後音沙汰無い状態になってしまっていたのだが,実は本を紛失していて止まっていた.
- 作者: Richard Bird,山下伸夫
- 出版社/メーカー: オーム社
- 発売日: 2012/10/26
- メディア: 単行本(ソフトカバー)
- 購入: 3人 クリック: 28回
- この商品を含むブログ (5件) を見る
発見したので再開する.今回は1.3.1,1.3.2.
1.3.1
multiply (0, infinity)
を簡約すると以下のようになる.
multiply (0, infinity) => if 0 == 0 then 0 else 0 x infinity => 0
同様に,multiply (infinity, 0)
を簡約すると
multiply (infinity, 0) => if infinity == 0 then 0 else 0 x infinity
ここで,==
は両辺の値を正規形まで簡約する必要があるので,無限ループとなり,答えは返ってこない.
1.3.2
h
が正格であるための条件は,h ⊥ = ⊥
であること.
h ⊥ => f ( g ⊥ ) => f ⊥ (∵ gは正格) => ⊥ (∵fは正格)
よってh
は正格