Racket 类型化球拍中动态所需函数的cast应用

Racket 类型化球拍中动态所需函数的cast应用,racket,typed-racket,Racket,Typed Racket,我试图在运行时从不同的模块加载并使用一个函数。问题在于,动态要求的范围,任何,似乎无法将转换为更具体的(功能)类型 test.rkt: #lang打字/拍子 (模块其他模块类型/球拍 (提供f) (:f:Integer->Integer) (定义(f x) (*x2))) ; g具有Any类型,因为dynamic require返回Any类型的值 (定义g(动态要求(子模块“test.rkt”其他模块)“f)) ;违反合同 ; 试图在非类型化代码中使用作为“Any”传递的高阶值:# ; 有吗

我试图在运行时从不同的模块加载并使用一个函数。问题在于,
动态要求
的范围,
任何
,似乎无法将
转换为更具体的(功能)类型

test.rkt:

#lang打字/拍子
(模块其他模块类型/球拍
(提供f)
(:f:Integer->Integer)
(定义(f x)
(*x2)))
; g具有Any类型,因为dynamic require返回Any类型的值
(定义g(动态要求(子模块“test.rkt”其他模块)“f))
;违反合同
;  试图在非类型化代码中使用作为“Any”传递的高阶值:#
;  有吗
;  合同来自:类型化世界
;  责备:演员
;   (假设合同是正确的)
((强制转换g(->整数))3)

有没有办法在运行时从
#lang typed/racket
中的不同模块加载和使用函数?

一种解决方法是在非类型模块中加载函数,并使用
require/typed
分配类型:

#lang typed/racket

(module other-module typed/racket
  (provide f)
  (: f : Integer -> Integer)
  (define (f x)
    (* x 2)))

(module another-module racket
  (define g (dynamic-require '(submod "test.rkt" other-module) 'f))
  (provide g))

(require/typed 'another-module
  (g (-> Integer Integer)))

(g 3)
;; 6
但是是的,如果
dynamic require
可以采用目标类型或类型球拍允许的非类型区域(与之相反),那就更好了