"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)
。
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)
以下代码产生名义错误:
(: 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)
。
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)