Types 表示函数EOF->;错误,A->;A∀;A&x2260;输入型球拍中的EOF?

Types 表示函数EOF->;错误,A->;A∀;A&x2260;输入型球拍中的EOF?,types,racket,typed-racket,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 g

我试图在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
的类型呢?

我想您想要的类型是:

(: neof (All (A) (A -> (U False A) :
                    #:+ (! EOF)
                    #:- (or EOF False))))
#:-
子句是可选的,为了完整起见,我只是将其包含在其中。)

注意:如果包含
#:-
子句,它将不会在Racket 6.1.1中进行类型检查。删除该条款将允许其在第6.1.1条中传递


这里的问题是
case->
的所有分支必须相互独立地进行类型检查。对于
(A->A)
情况,它失败是因为
#f
不是
A
。第一个案例中出现的打字信息不会影响第二个案例的打字。

你的答案看起来不错,所以我很有希望。不幸的是,结果是:
类型检查器:类型不匹配;预期筛选器不匹配:(!EOF@x)| Bot)\n给定:(!(U False EOF)@x)|((U False EOF)@x))\n in:(如果(EOF object?x)#f x)
(\n是我添加的,它们是注释不能有>>的新行)@JDavidSmith-Hmm,你是对的,它不会在Racket 6.1.1上为我进行打字检查。打字球拍目前正处于相当繁重的开发阶段,所以这似乎只是对快照进行打字检查。如果你愿意的话,你可以下载一个比较稳定的。否则,您可能必须等到下一个版本。@JDavidSmith如果您删除
#:-
案例,它将在Racket 6.1.1上进行打字检查。我刚刚做了这件事。精彩的!谢谢这似乎并没有说明neof不能返回EOF类型的值这一事实。现在,我很高兴它通过了类型检查。我明天可以试试快照。