練習問題 1.4.1
fおよび
gが以下の型を持つとする.
f :: Integer -> Integer
g :: Integer -> (Integer -> Integer)
hを以下のように定義してみよう.
h :: WhatType
h x y = f (g x y)
hに正しい型を割り当てよ. 次に,以下の表明のうち正しいものはどれか(あるだけすべて)答えよ.
h = f . g
h x = f . (g x)
h x y = (f . g) x y
型の割り当ては以下のとおり
x
はg :: Integer -> (Integer -> Integer)
の引数であるからx :: Integer
y
はg x :: Integer -> Integer
の引数であるからy :: Integer
g x y :: Integer
でありf (g x y) :: Integer
であるからh x y :: Integer
- したがって
h :: Integer -> Integer -> Integer
というわけで,
type WhatType = Integer -> Integer -> Integer
hの定義から
h x y = f (g x y)
= { g x y = (g x) y }
h x y = f ((g x) y)
= { (.) の定義 }
h x y = (f . g x) y
= { セクション }
h x y = ((f .) (g x)) y
= { 外延性の原理 }
h x = (f .) (g x)
= { セクション }
h x = f . (g x)
= { セクション }
h x = (f .) (g x)
= { (.) の定義 }
h x = ((f .) . g) x
= { 外延性の原理 }
h = (f .) . g
したがって
h x = f . (g x)は正しい表明.
h = f . gと
h x y = (f . g) x yは外延性の原理により等価な表明であるが,型があわないのでともに正しい表明ではない.