Haskell почему [fst, snd]: [(a, a) - > a]
Я изучаю Haskell и задаюсь вопросом, почему
[fst,snd] :: [(a,a) -> a]
Я изначально писал
[fst,snd] :: [(a,b) -> a, (c, d) -> d]
Я не могу понять, почему это так; может кто-нибудь объяснить?
спасибо
1 ответов
дело в том, что списки в Haskell являются однородной структурой данных (конечно, у вас могут быть гетерогенные списки, но это другая история). Таким образом, при использовании полиморфных функций в качестве элементов списков они должны иметь один и тот же тип.
в вашем случае вы используете fst :: (a , b) -> a
и snd :: (a, b) -> b
как список элементов так, они должны иметь тот же тип. Чтобы обеспечить одинаковость этих типов, тип вывода прибегает к унификации первого порядка. Объединяющий
(a , b) -> a
и
(a , b) -> b
мы замечаем, что следующая подстановка делает эти типы равными
[b +-> a] -- means substitute occurrences of b for a
применяя его к обоим типам, мы получаем
(a,a) -> a
как Хаскелл говорит вам.