Próbuję określić adnotacji typu dla następujących funkcji w Typed Racket:Reprezentowanie funkcji EOF -> Fałsz, A -> A ∀ A ≠ EOF w typowanej rakiecie?
(define (neof x)
(if (eof-object? x) #f x))
pozostawiając ją un-uwagami daje typ:
(Any -> Any)
korzystania z tego typu generuje błąd:
(: neof (All (A) (case->
(EOF -> False)
(A -> A : #:+ (! EOF))))
expected: A
given: False
in: #f
Jest to prawdopodobnie dlatego, że można pozwolić A = EOF
, a następnie otrzymujemy EOF -> EOF
.
Typ (: neof (All (A) A -> (U A False) #:- (U EOF False)))
, choć nie tak oczywiste, jak wyżej, daje również błędy:
mismatch in filter
expected: (Top | Bot)
given: ((! (U False EOF) @ x) | ((U False EOF) @ x))
in: (if (eof-object? x) #f x)
Moim celem było mieć funkcję, która mógłbym zastosować do dowolnego wyjścia z portu uzyskać albo False
lub temu wartość z portu. Teraz zastanawiam się nad potrzebą tego, ponieważ zbyt dużo czasu spędziłem próbując dojść do tego typu.
Dla kompletności, próbowałem również tę definicję neof
.
(define/match (neof x)
[((? eof-object?)) #f]
[((? (compose not eof-object?))) x])
(również drugi wzór jest _
, ale które nie kodują tę samą ilość informacji typu W tym momencie jestem bardziej próbuje uspokoić sprawdzanie typu niż cokolwiek innego).
Więc: w jaki sposób mogę reprezentować typ neof
?
Twoja odpowiedź wyglądała dobrze, więc byłam naprawdę pełna nadziei. Niestety, jest to wynik: 'Checker typu: niedopasowanie typu; Niedopasowanie w filtrze oczekiwano: ((! EOF @ x) | Bot) \ n podano: ((! (U Fałszywe EOF) @ x) | ((U Fałszywe EOF) @ x)) \ n w: (if (eof-object? x) #fx) ' (\ n dodane przeze mnie, to newlines, których komentarze nie mogą mieć>.>) –
@JDavidSmith Hmm, masz rację, to nie sprawdza typeche dla mnie na rakiecie 6.1.1. Typed Racket jest obecnie w bardzo ciężkim rozwoju, więc jest to coś, co wydaje się tylko typecheck na migawkach. Można pobrać [kompilację migawek] (http: //pre.racket-lang.org/installers /) jeśli chcesz - są zwykle dość stabilne. W przeciwnym razie możesz poczekać do następnego wydania. –
@JDavidSmith Jeśli usuniesz przypadek '#: -', to jednak sprawdzi on na Racket 6.1.1. –