本当は怖いHPC

HPC屋の趣味&実益ブログ

関数プログラミング入門・一人読書会 (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

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

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

関数プログラミング入門・一人読書会 (3)

関数プログラミング入門」の練習問題をやっていきます

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

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

今回は1.4.1〜1.4.7

1.4.1

hの型は,

h :: Integer -> Integer -> Integer

fとgの型は f :: Integer -> Integerg :: 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)

前回,読み始めたというエントリを書いて,その後音沙汰無い状態になってしまっていたのだが,実は本を紛失していて止まっていた.

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

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

発見したので再開する.今回は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は正格

【広告】