Есть ли разница между типовыми сигнатурами a -> b -> a и c -> a -> c?

16

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

a -> b -> a 

а также

c -> a -> c 

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

Dreana
источник
6
Нет, вы просто изменили имя переменных типа . До тех пор, пока вы не переименуете переменную в другую переменную (например, есть конфликт имен), проблем не будет.
Виллем Ван Онсем
Зависит от того, связаны ли переменные типа в другом месте.
Берги

Ответы:

17

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

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

Виллем Ван Онсем
источник
16

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

Сережа Боголюбов
источник