2015-03-19 17 views
5

Tôi cố gắng để xác định loại chú thích cho các chức năng sau đây trong Typed vợt:Đại diện cho hàm EOF -> False, A -> A ∀ A ≠ EOF trong vợt đã nhập?

(define (neof x) 
    (if (eof-object? x) #f x)) 

Rời nó bỏ chú thích cho các loại:

(Any -> Any) 

Sử dụng loại này tạo ra một lỗi:

(: neof (All (A) (case-> 
        (EOF -> False) 
        (A -> A : #:+ (! EOF)))) 

    expected: A 
    given: False 
    in: #f 

Điều này có lẽ là vì người ta có thể để A = EOF và sau đó chúng tôi nhận được EOF -> EOF.

Loại (: neof (All (A) A -> (U A False) #:- (U EOF False))), trong khi không rõ ràng như trên, cũng cung cấp cho các lỗi:

mismatch in filter 
    expected: (Top | Bot) 
    given: ((! (U False EOF) @ x) | ((U False EOF) @ x)) 
    in: (if (eof-object? x) #f x) 

Mục tiêu của tôi là để có một chức năng mà tôi có thể áp dụng cho bất kỳ đầu ra từ một cổng một có được một trong hai False hoặc giá trị từ cổng. Bây giờ tôi đang xem xét lại nhu cầu này, vì tôi đã thổi quá nhiều thời gian để tìm ra loại hình này.

Để hoàn chỉnh, tôi cũng đã cố gắng định nghĩa này của neof:.

(define/match (neof x) 
    [((? eof-object?)) #f] 
    [((? (compose not eof-object?))) x]) 

(Cũng với mô hình thứ hai là _, nhưng điều đó không mã hóa cùng một lượng thông tin loại Tại thời điểm này tôi cố gắng xoa dịu bộ kiểm tra kiểu hơn bất kỳ thứ gì).

Vì vậy: làm thế nào tôi có thể đại diện cho loại neof?

Trả lời

3

Tôi nghĩ kiểu bạn muốn là thế này:

(: neof (All (A) (A -> (U False A) : 
        #:+ (! EOF) 
        #:- (or EOF False)))) 

(Mệnh đề #:- là không bắt buộc, tôi chỉ bao gồm nó ở đó cho đầy đủ.)

Lưu ý: Nếu mệnh đề #:- được bao gồm, nó sẽ không typecheck trong vợt 6.1.1. Việc loại bỏ mệnh đề sẽ cho phép nó vượt qua trên 6.1.1.

Vấn đề ở đây là tất cả các chi nhánh của case-> phải gõ độc lập của nhau. Đối với trường hợp (A -> A), nó không thành công vì #f không phải là A. Thông tin gõ xuất hiện từ trường hợp đầu tiên không thể ảnh hưởng đến việc đánh máy vào trường hợp thứ hai.

+0

Câu trả lời của bạn có vẻ tốt, vì vậy tôi thực sự hy vọng. Thật không may, đây là kết quả: 'Loại Trình kiểm tra: loại không phù hợp; không khớp trong bộ lọc dự kiến: ((! EOF @ x) | Bot) \ n cho: ((! (U Sai EOF) @ x) | ((U Sai EOF) @ x)) \ n trong: (if (eof-object? x) #fx) ' (\ n được thêm bởi tôi, chúng có dòng mới không có chú thích>.>) –

+0

@JDavidSmith Hmm, bạn nói đúng, nó không gõ cho tôi trên vợt 6.1.1. Typed Racket hiện đang phát triển khá nặng, do đó, đây là một cái gì đó mà chỉ có vẻ typecheck trên các bức ảnh chụp. Bạn có thể tải xuống [snapshot build] (http: //pre.racket-lang.org/installers /) nếu bạn muốn — chúng thường khá ổn định. Nếu không, bạn có thể phải chờ đến khi bản phát hành tiếp theo. –

+0

@JDavidSmith Nếu bạn loại bỏ trường hợp '#: -', mặc dù, nó sẽ đánh máy trên vợt 6.1.1. –

Các vấn đề liên quan