練習問題 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
は外延性の原理により等価な表明であるが,型があわないのでともに正しい表明ではない.