Types 表示函数EOF->;错误,A->;A∀;A&x2260;输入型球拍中的EOF?
我试图在Typed Racket中为以下函数定义类型注释: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
(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类型的值这一事实。现在,我很高兴它通过了类型检查。我明天可以试试快照。