Gibt es einen Unterschied zwischen den Typensignaturen a -> b -> a und c -> a -> c?

16

Diese Frage ist eine theoretische Frage zu Haskell-Funktionen, die Argumente jeglicher Art annehmen können. Gibt es einen Unterschied zwischen der Funktionsweise mit den Typensignaturen von

a -> b -> a 

und

c -> a -> c 

instanziiert werden? Jede Hilfe wird geschätzt.

Dreana
quelle
6
Nein, Sie haben einfach den Namen der Typvariablen geändert . Solange Sie eine Variable nicht in eine andere Variable umbenennen (so dass es zu einem Namenskonflikt kommt), gibt es kein Problem.
Willem Van Onsem
Hängt davon ab, ob / wie die Typvariablen an anderer Stelle gebunden sind.
Bergi

Antworten:

17

Es gibt keinen Unterschied. Da a, bund cmit einem Start Klein , sind diese Variablen . Sie können Variablen umbenennen, und dies bleibt gleich, solange zwei (oder mehr) Variablen nicht " zusammenstoßen ".

Solche Konflikte können auftreten, wenn Sie eine Variable so umbenennen, dass sie denselben Namen wie eine andere Variable hat, oder wenn Sie zwei (oder mehr) Variablen in denselben neuen Namen umbenennen. Wenn Sie die Variable abeispielsweise bin Ihrem ersten Codefragment umbenennen würden, würden wir erhalten b -> b -> b, aber das ist nicht dasselbe, da wir dann erzwingen, dass der erste und der zweite Parameter vom gleichen Typ sind. Während wir in Ihrer Typensignatur die Freiheit haben, zwei Typen auszuwählen, die gleich sein können, ist dies jedoch nicht erforderlich.

Willem Van Onsem
quelle
16

Nee. Denken Sie an a -> b -> aals This Type -> Another Type -> This Type. Dann passen beide zum gegebenen Muster. Etwas a -> b -> cpasst jedoch nicht: This Type -> That Type -> Yet Another Typeist (im Allgemeinen) anders; außer dem Randfall wann c = a, der das Muster ergibt, an dem Sie interessiert sind.

Sereja Bogolubov
quelle