ho funzione come di seguito:funzione non poteva competere tipo
foo :: Int -> a -> [a]
foo n v = bar n
where
bar :: Int -> [a]
bar n = take n $ repeat v
usando rapporto ghci questo errore:
Couldn't match type `a' with `a1'
`a' is a rigid type variable bound by
the type signature for foo :: Int -> a -> [a] at hs99.hs:872:1
`a1' is a rigid type variable bound by
the type signature for bar :: Int -> [a1] at hs99.hs:875:9
Expected type: [a1]
Actual type: [a]
In the expression: take n $ repeat v
In an equation for `bar': bar n = take n $ repeat v
Se la rimozione della dichiarazione del tipo di barre, il codice può essere compilato senza errori. Quindi qual è la dichiarazione di tipo corretta di bar qui? E perché l'errore si verifica, perché la dichiarazione del tipo di barra è più generica della definizione di barra (che è associata ad un tipo in foo)?
Grazie per qualsiasi aiuto!
Grazie per l'aiuto! Come ho detto, se si rimuove la dichiarazione di tipo 'bar', ghci può compilare il codice, significa ghci implicitamente utilizzando ScopedTypeVariable qui per esso? – Orup
essere più chiari, le variabili di tipo scoped e la rimozione della dichiarazione del tipo 'bar' entrambi possono rendere il codice compilato. mi chiedo solo se stiano facendo lo stesso trucco. – Orup
No, arrivano allo stesso codice compilato, ma ci arrivano in modo diverso. Vedi la mia modifica. – dave4420