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

как Хаскелл говорит вам.