stavo giocando intorno con lenti van Laarhoven e sono imbattuto in un problema in cui il tipo ortografico rifiuta la forma eta-ridotta di una funzione ben tipato:Come può l'eta-riduzione di una funzione ben tipizzata causare un errore di tipo?
{-# LANGUAGE RankNTypes #-}
import Control.Applicative
type Lens c a = forall f . Functor f => (a -> f a) -> (c -> f c)
getWith :: (a -> b) -> ((a -> Const b a) -> (c -> Const b c)) -> (c -> b)
getWith f l = getConst . l (Const . f)
get :: Lens c a -> c -> a
get lens = getWith id lens
Le suddette tipo di controlli, ma se io eta- ridurre get
a
get :: Lens c a -> c -> a
get = getWith id
Poi GHC (7.4.2) si lamenta che
Couldn't match expected type `Lens c a'
with actual type `(a0 -> Const b0 a0) -> c0 -> Const b0 c0'
Expected type: Lens c a -> c -> a
Actual type: ((a0 -> Const b0 a0) -> c0 -> Const b0 c0)
-> c0 -> b0
In the return type of a call of `getWith'
In the expression: getWith id
posso capire che se la funzione d Se non si dispone di una firma di tipo esplicita, l'eta-riduzione in combinazione con la limitazione del monomorfismo potrebbe confondere l'inferenza di tipo, specialmente quando si tratta di tipi di rango più alti, ma in questo caso non sono sicuro di cosa sta succedendo.
Quali sono le cause per cui GHC rifiuta la forma ridotta in base all'Eta e si tratta di un bug/limitazione in GHC o di qualche problema fondamentale con tipi di rango più alti?
Fa la differenza quando si scrive il tipo 'Lens' espanso? – Ingo