2016-05-29 12 views
0

Ich schaue auf die continuation passing style tutorial und kann die Typen in der folgenden Funktion nicht verstehen.Was ist der Typ der Variablen in chainCPS?

chainCPS :: ((a -> r) -> r) -> (a -> ((b -> r) -> r)) -> ((b -> r) -> r) 
    chainCPS s f k = s z where 
    -- z :: (a -> r) -> a -> ((b -> r) -> r) -- Fails 
    z x = f x k 

Das Obige ist die Umgestaltung der folgenden Möglichkeiten:

chainCPS :: ((a -> r) -> r) -> (a -> ((b -> r) -> r)) -> ((b -> r) -> r) 
    chainCPS s f = \k -> s $ \x -> f x $ k 

am Typ Info vom Herausgeber Atom bereitgestellt Suche kann ich sehen, dass s :: (a -> r) -> r, f :: a -> (b -> r) -> r, k :: b -> r. Weiter in z ist die x vom Typ x :: a.

Was mich verwirrt ist, dass z vom Typ z :: a -> r ist.

Das bedeutet, dass s z vom Typ sein sollte r nach z zu s Anwendung.

Wenn ja, wie kommt der endgültige Typ zu (b -> r) -> r?

Edit: Die b -> r kommt von k ... richtig. Das heißt z ist wirklich vom Typ a -> r, wie der Herausgeber sagt. Aber warum scheitert die folgende Typenkontrolle?

chainCPS :: ((a -> r) -> r) -> (a -> ((b -> r) -> r)) -> (b -> r) -> r 
    chainCPS s f k = s z where 
    z :: a -> r 
    z x = f x k 

Antwort

1

Das bedeutet, dass s z vom Typ sein sollte r nach z zu s Anwendung.

Nein. Es stimmt, dass z someArg vom Typ r ist, wenn someArg vom Typ a ist, aber hier gelten s, nicht z.

Hier stattdessen haben wir

s :: (a -> r) -> r 
z :: (a -> r) 

so z den Typ des Arguments von s übereinstimmt. Daher ist der resultierende Typ das Ergebnis von , welches r ist.

+0

Ich denke, ich habe meine Terminologie durcheinander gebracht. Aber warum gibt das obige einen Typfehler, wenn ich den Typ von z explizit wie z: a -> r ausschreibe? –

+0

@MarkoGrdinic Wegen einer wohl falschen Standardinterpretationsregel dieser Signatur. Kurz gesagt, Haskell geht davon aus, dass jede Signatur unabhängig von anderen ist, so dass Ihr 'a' in' z :: a -> r' nicht verwandt ist mit dem 'a' in der Signatur von' chainCPS'. Sie können Haskell sagen, dass sie in der Tat die gleiche Sache sind, wenn Sie 'chainCPS :: forall a b r schreiben. ... 'und aktivieren Sie die Erweiterung' ScopedTypeVariables'. https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#lexical-scoped-type-variables – chi