Если вы хотите использовать GHC лексически скопированные переменные типа, вам также нужно использовать явное универсальное количественное определение, То есть вы должны добавить объявления forall
к подписям типа ваших функций:
{-# LANGUAGE ExplicitForAll, ScopedTypeVariables #-}
f :: forall a . [a] -> [a] -- The `forall` is required here ...
f (x:xs) = xs ++ [x :: a] -- ... to relate this `a` to the ones above.
На самом деле это имеет какое-то отношение к количественной оценке, или авторы расширений просто кооперируют ключевое слово forall
в качестве удобного маркера для того, где применяется новое более широкое охват?
Другими словами, почему мы не можем оставить forall
, как обычно? Разве не ясно, что переменные типа в аннотациях внутри тела функции относятся к переменным с тем же именем в сигнатуре функции? Или написание будет как-то проблематичным или двусмысленным?