"Inference for polymorphic keyword functions not supported"

"Inference for polymorphic keyword functions not supported"

以下代码产生名义错误:

(: f (∀ (a) (-> [#:x a] (U Integer a))))
(define (f #:x [x #f]) (or x 0))

(f #:x 3)

OK,但是 (f #:x (cast 3 Integer)) 仍然产生同样的错误。其具体化值球拍试图推断的类型变量在哪里,即我需要明确指定其值的类型变量?

注意:我尝试转换 (cast (f #:x (cast 3 Integer)) Integer),但 DrRacket 仅突出显示类型错误的内部 (f ...) 形式。

解决这个问题的方法是注释 f 本身,而不是输入或输出。

此外,您不应该为此使用 cast,使用 ann instead of cast for assigning types to expressions. Using ann 看起来像 (ann 3 Integer)

有 2 种注释方法 fann or inst 都可以。

ann

使用 ann,您可以将 f 的类型细化为其类型的非多态版本。原始类型是(∀ (a) (-> [#:x a] (U Integer a))),所以带Integer的非多态版本是(-> [#:x Integer] Integer)。注释 f:

(ann f (-> [#:x Integer] Integer))

在上下文中,在函数调用中注释 f

((ann f (-> [#:x Integer] Integer)) #:x 3)

inst

带有 ann 的示例很长,因为它重写了 f 类型的专用版本。对于专门化多态类型,较短的方法是 inst:

(inst f Integer)

通过将类型参数 a 替换为 Integer,这会自动为您将类型特化为 (-> [#:x Integer] Integer)。在上下文中,在函数调用中注释 f

((inst f Integer) #:x 3)