Ich versuche, die Typanmerkung für die folgende Funktion in typisierten Racket zu definieren:Darstellen der Funktion EOF -> Falsch, A -> A ∀ A ≠ EOF in getipptem Racket?
(define (neof x)
(if (eof-object? x) #f x))
Verlassen sie un-kommentierten gibt den Typ:
(Any -> Any)
Mit dieser Art erzeugt einen Fehler:
(: neof (All (A) (case->
(EOF -> False)
(A -> A : #:+ (! EOF))))
expected: A
given: False
in: #f
Dies ist vermutlich, weil man A = EOF
lassen kann und dann erhalten wir EOF -> EOF
.
Der Typ (: neof (All (A) A -> (U A False) #:- (U EOF False)))
, die zwar nicht so klar wie die oben, auch Fehler gibt:
mismatch in filter
expected: (Top | Bot)
given: ((! (U False EOF) @ x) | ((U False EOF) @ x))
in: (if (eof-object? x) #f x)
Mein Ziel eine bekommen entweder False
oder eine Funktion, die ich anwenden könnte auf jeden Ausgang von einem Hafen haben war Wert vom Port. Ich überdenke jetzt die Notwendigkeit dafür, da ich viel zu viel Zeit damit verbracht habe, diesen Typ herauszufinden.
Der Vollständigkeit halber habe ich auch versucht, diese Definition von neof
.
(define/match (neof x)
[((? eof-object?)) #f]
[((? (compose not eof-object?))) x])
(Auch mit dem zweiten Muster _
zu sein, aber das kodiert nicht für die gleiche Menge an Typ-Informationen An diesem Punkt bin ich mehr versuchen, den Typ Checker als alles zu beschwichtigen).
Also: wie kann ich den Typ neof
darstellen?
Ihre Antwort sah gut aus, also war ich wirklich hoffnungsvoll. Leider ist dies das Ergebnis: 'Type Checker: Typ Mismatch; Nichtübereinstimmung im Filter erwartet: ((! EOF @ x) | Bot) \ n gegeben: ((! (U False EOF) @ x) | ((U False EOF) @ x)) \ n in: (if (eof-object? x) #fx) ' (\ n ist von mir hinzugefügt, theyr'e Zeilenumbrüche, die Kommentare nicht haben können>.>) –
@JDavidSmith Hmm, du hast recht, es tippt nicht nach für mich auf Racket 6.1.1. Typed Racket befindet sich derzeit in einer ziemlich starken Entwicklung, daher scheint dies nur auf den Snapshots überprüft zu werden. Sie können eine [Schnappschuss-Erstellung] herunterladen (http: //pre.racket-lang.org/installateurs /) wenn du möchtest - sie sind normalerweise ziemlich stabil. Andernfalls müssen Sie möglicherweise bis zur nächsten Veröffentlichung warten. –
@JDavidSmith Wenn Sie den '#: -' Fall entfernen, wird es jedoch auf Racket 6.1.1 überprüft. –