Czy istnieje różnica między podpisami typów a -> b -> a oraz c -> a -> c?

16

To pytanie teoretyczne dotyczy funkcji Haskella, które mogą przyjmować argumenty dowolnego typu. Czy istnieje różnica między sposobem działania z podpisami typu

a -> b -> a 

i

c -> a -> c 

są tworzone? Każda pomoc jest mile widziana.

Dreana
źródło
6
Nie, po prostu zmieniłeś nazwę zmiennych typu . Dopóki nie zmienisz nazwy zmiennej na inną zmienną (taką, że występuje konflikt nazw), nie ma problemu.
Willem Van Onsem
Zależy od tego, czy / jak zmienne typu są powiązane gdzie indziej.
Bergi,

Odpowiedzi:

17

Nie ma różnicy. Ponieważ a, bi czacząć od małej litery , są zmienne . Możesz zmieniać nazwy zmiennych, a to pozostaje takie samo, o ile dwie (lub więcej) zmienne nie „ zderzają się ”.

Takie starcia mogą się zdarzyć, jeśli zmienisz nazwę zmiennej, tak aby miała taką samą nazwę jak inna zmienna, lub gdy zmienisz nazwę dwóch (lub więcej) zmiennych na tę samą nową nazwę. Jeśli zmienilibyśmy nazwę zmiennej ana przykład bw swoim pierwszym fragmencie kodu, otrzymalibyśmy b -> b -> b, ale to nie to samo, ponieważ wówczas wymuszamy, aby pierwszy i drugi parametr były tego samego typu. Podczas gdy w twoim podpisie typu mamy swobodę wyboru dwóch typów, które mogą być takie same, ale nie jest to konieczne.

Willem Van Onsem
źródło
16

Nie. Pomyśl a -> b -> ajak This Type -> Another Type -> This Type. Wtedy oba pasują do danego wzoru. Jednak coś takiego a -> b -> cnie pasuje: This Type -> That Type -> Yet Another Typejest (ogólnie) różne; z wyjątkiem przypadku krawędzi, kiedy c = a, który daje wzór, który Cię interesuje.

Sereja Bogolubov
źródło