При использовании интерактивного интерпретатора GHC можно запросить предполагаемый тип выражения:
Prelude> :t map
map :: (a -> b) -> [a] -> [b]
Кажется, что он берет имена переменных типа из подписи, поскольку map - это определено как
map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (x:xs) = f x : map f xs
в Прелюдии. В этом есть большой смысл! Мой вопрос: как выбираются имена переменных типа, если нет подписи?
Примером может быть
Prelude> :t map fst
map fst :: [(b, b1)] -> [b]
где он выбрал имена b и b1. Понятно, что переименование должно происходить, но простое начало с a, b, ... дало бы
map fst :: [(a, b)] -> [a]
вместо этого, что я считаю немного более читаемым.