Есть ли разница между типовыми сигнатурами a -> b -> a и c -> a -> c? - PullRequest
15 голосов
/ 27 октября 2019

Этот вопрос является теоретическим вопросом о функциях Haskell, которые могут принимать аргументы любого типа. Есть ли разница в том, как создаются функции с сигнатурами типов

a -> b -> a 

и

c -> a -> c 

? Любая помощь приветствуется.

Ответы [ 2 ]

16 голосов
/ 27 октября 2019

Разницы нет. Поскольку a, b и c начинаются с строчной буквы , это переменные . Вы можете переименовывать переменные, и это остается тем же самым, пока две (или более) переменные не " clash ".

Такие столкновения могут произойти, если вы переименуете переменную так, что онаимеет то же имя, что и другая переменная, или когда вы переименовываете две (или более) переменные в одно и то же новое имя. Если вы переименуете переменную a, например, в b в вашем первом фрагменте кода, мы получим b -> b -> b, но это не одно и то же, так как тогда мы обеспечим, чтобы первый и второй параметры были одинаковымитип. В то время как в вашей подписи типа у нас есть свобода выбора двух типов, которые могут быть одинаковыми, но это , а не необходимо.

16 голосов
/ 27 октября 2019

Неа. Думайте о a -> b -> a как This Type -> Another Type -> This Type. Тогда оба они соответствуют заданному шаблону. Однако, что-то вроде a -> b -> c не подходит: This Type -> That Type -> Yet Another Type (в общем) отличается;кроме крайнего случая, когда c = a, что дает интересующий вас паттерн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...