p
Size: a a a
p
p
ЗП
YP
ЗП
YP
AG
p
p
module Main where
import Prelude
import Data.Maybe
import Data.Array
import Data.List ( List( .. ), (:) )
import Control.Monad.Eff ( Eff )
main :: Eff () Unit
main = pure unit
type Poly = forall a . a -> a
poly :: Poly
poly = \ a -> a
fooA :: Array Poly
fooA = [ poly, poly ]
{-
The type variable a has escaped its scope, appearing in the type
List (a1 -> a1) -> List (a1 -> a1)
-}
-- fooL :: List Poly
-- fooL = poly : poly : Nil
-- baz :: Maybe Poly
baz :: _
baz = index fooA 0
VY
VY
p
VY
fooL :: forall a. List (a -> a)
p
forall a . List ( a -> a )p
fooA :: Array Poly
fooA = poly : poly : []
Array (a1 -> a1) -> Array (a1 -> a1)
cons :: forall a. a -> Array a -> Array a
a как Poly, а для этого нам нужен impredicative polymorphism ( IP ) [ poly, poly ] :: Array Poly
index fooA 0
index :: forall a. Array a -> Int -> Maybe a
a в Poly? Почему это не IP?p
p
VY