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.
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.
Odpowiedzi:
Nie ma różnicy. Ponieważ a
, b
i c
zacząć 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 a
na przykład b
w 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.
Nie. Pomyśl a -> b -> a
jak This Type -> Another Type -> This Type
. Wtedy oba pasują do danego wzoru. Jednak coś takiego a -> b -> c
nie pasuje: This Type -> That Type -> Yet Another Type
jest (ogólnie) różne; z wyjątkiem przypadku krawędzi, kiedy c = a
, który daje wzór, który Cię interesuje.