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
可以采用目标类型或类型球拍允许的非类型区域(与之相反),那就更好了