Prendre l'humble fonction identité en Haskell,
id :: forall a. a -> a
Étant donné que Haskell censé prendre en charge impredicative polymorphisme, il semble raisonnable que je devrais être en mesure de "restreindre" id
pour le type (forall a. a -> a) -> (forall b. b -> b)
par type d'attribution. Mais cela ne fonctionne pas:
Prelude> id :: (forall a. a -> a) -> (forall b. b -> b)
<interactive>:1:1:
Couldn't match expected type `b -> b'
with actual type `forall a. a -> a'
Expected type: (forall a. a -> a) -> b -> b
Actual type: (forall a. a -> a) -> forall a. a -> a
In the expression: id :: (forall a. a -> a) -> (forall b. b -> b)
In an equation for `it':
it = id :: (forall a. a -> a) -> (forall b. b -> b)
Il est bien sûr possible de définir une nouvelle forme restreinte de l'identité, fonction souhaitée signature:
restrictedId :: (forall a. a -> a) -> (forall b. b -> b)
restrictedId x = x
Cependant à définir en fonction de la générale id
ne fonctionne pas:
restrictedId :: (forall a. a -> a) -> (forall b. b -> b)
restrictedId = id -- Similar error to above
Alors que ce passe ici? Il semble que cela pourrait être lié à des difficultés avec impredicativity, mais l'activation -XImpredicativeTypes
ne fait aucune différence.