代表功能OF - >错,A - > A∀AN≠类型球拍中的EOF?

时间:2015-03-19 22:24:27

标签: types racket typed-racket

我正在尝试在Typed Racket中为以下函数定义类型注释:

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

保留未注释的类型:

(Any -> Any)

使用此类型会产生错误:

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

  expected: A
  given: False
  in: #f

这可能是因为我们可以A = EOF然后获得EOF -> EOF

类型(: neof (All (A) A -> (U A False) #:- (U EOF False)))虽然不如上所述,但也会出错:

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

我的目标是拥有一个函数,我可以将其应用于端口的任何输出,获取False或来自端口的值。我现在正在重新考虑对此的需求,因为我已经花了太多时间试图弄清楚这种类型。

为了完整起见,我还尝试了neof

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

(同样第二个模式是_,但是它没有编码相同数量的类型信息。此时我更多地试图安抚类型检查器而不是任何东西)。

那么:我如何表示neof的类型?

1 个答案:

答案 0 :(得分:3)

我认为你想要的类型是:

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

#:-子句是可选的,我只是将其包含在那里以保证完整性。)

注意: 如果包含#:-子句,则在Racket 6.1.1中类型检查。删除该子句将允许它传递6.1.1。

这里的问题是case->的所有分支都必须独立地检查彼此。对于(A -> A)案例,它失败了,因为#f不是A。第一种情况下出现的输入信息不会影响对第二种情况的类型检查。