5

Zum Beispiel, wie kann ich eine Version von map schreiben, die mit polymorphen Funktionen in typed Racket funktionieren wird? Ich benutze eine einfache id Funktion wie folgt definiert:Wie schreibe ich Funktionen höherer Ordnung, die polymorphe Funktionen als Argumente in Typed Racket nehmen?

(: id : (All (A) A -> A)) 
(define (id x) x) 

Wenn ich versuche es über eine Liste zu kartieren i einen Fehler:

> (map id '(1 2 3)) 

Type Checker: Polymorphic function `map' could not be applied to arguments: 
Types: (-> a b ... b c) (Listof a) (Listof b) ... b -> (Listof c) 
    (-> a c) (Pairof a (Listof a)) -> (Pairof c (Listof c)) 
Arguments: (All (A) (-> A A)) (List One Positive-Byte Positive-Byte) 
Expected result: AnyValues 
    in: (map id (quote (1 2 3))) 

Antwort

1

Sie müssen manuell den Polymorphismus in diesem Fall instanziiert:

-> (map (inst identity Integer) '(1 2 3)) 
- : (Listof Integer) [more precisely: (Pairof Integer (Listof Integer))] 
'(1 2 3) 

der Grund in der typisierten Racket-Führer erklärt here:

Typed Racket’s local type inference algorithm is currently not able to infer types for polymorphic functions that are used on higher-order arguments that are themselves polymorphic.

(siehe Dokumentation für weitere Erklärungen und Beispiele)

+0

Das ist traurig. Vielen Dank. –