本当は怖いHPC

HPC屋の趣味&実益ブログ

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