При использовании интерактивного интерпретатора 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]
вместо этого, что я считаю немного более читаемым.