作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 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
.第一种情况的发生类型信息不会影响第二种情况的类型检查。
关于types - 在 Typed Racket 中表示函数 EOF -> False, A -> A ∀ A ≠ EOF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29156104/
我是一名优秀的程序员,十分优秀!