gpt4 book ai didi

types - 在 Typed Racket 中表示函数 EOF -> False, A -> A ∀ A ≠ EOF?

转载 作者:行者123 更新时间:2023-12-04 20:39:33 29 4
gpt4 key购买 nike

我正在尝试为 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com