rank-1 type
関数の型にparameterを含む関数
ちゃんというと (?)
rank-0 typeな関数をfirst class objectとして扱う関数
foo :: (a -> a) -> a -> a
がrank-1であることは、「rank-0 typeを引数に取る」で説明がつく
しかしそれだけだと id :: a -> a
がrank-1であることの説明がつかない
例
purs(hs)length :: ∀ a. [a] -> Int
id :: ∀ a. a -> a
foo :: ∀ a. (a -> a) -> a -> a
hoge :: ∀ a. Int -> a -- 実用的なものかは知らないけど、定義的にはコレも入るはず
forall a
は全体にかかる
hsfoo :: forall a . ([a] -> Int) -> Int
foo :: forall a . (([a] -> Int) -> Int) -- 敢えて括弧を付けるなら
関数全体が forall
で囲われている
2つある場合も同様
hsfst :: forall a. forall b. (a,b) -> a
fst :: forall a b. (a,b) -> a