mam funkcję jak poniżej:funkcja nie mógł dopasować rodzaj
foo :: Int -> a -> [a]
foo n v = bar n
where
bar :: Int -> [a]
bar n = take n $ repeat v
korzystając raport ghci ten błąd:
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
Jeśli usunięcie deklaracji typu pręta, kod może zostać skompilowany bezbłędnie. Jaka jest tutaj właściwa deklaracja typu bar? I dlaczego pojawia się błąd, ponieważ deklaracja typu bar jest bardziej ogólna niż definicja paska (który jest związany z jakimś typem w foo)?
Dzięki za pomoc!
Dzięki za pomoc! Jak już powiedziałem, jeśli usuwając deklarację typu "bar", ghci może skompilować kod, czy to znaczy, że ghci domyślnie używa tutaj ScopedTypeVariable? – Orup
są bardziej przejrzyste, zmienne typu scoped i usuwając deklarację typu "bar", oba mogą spowodować kompilację kodu. tylko zastanawiam się, czy robią tę samą sztuczkę. – Orup
Nie, dostają ten sam skompilowany kod, ale dostają się tam inaczej. Zobacz moją edycję. – dave4420