Racket 如何将任何类型的值转换为实值?

Racket 如何将任何类型的值转换为实值?,racket,typed-racket,Racket,Typed Racket,我在玩球拍邮票,它是打字和普通球拍的混合体 我正在编写一个新功能,下面的代码试图调用一个包含实数列表的函数,但是因为这个列表来自非类型的racket,所以它实际上是一个包含以下内容的列表: (define bounding (make-parameter '())) ;; snip (when (not (empty? (bounding))) (let-values ([(x1 y1 x2 y2) (apply values (bounding))]) (send pr set

我在玩球拍邮票,它是打字和普通球拍的混合体

我正在编写一个新功能,下面的代码试图调用一个包含实数列表的函数,但是因为这个列表来自非类型的racket,所以它实际上是一个包含以下内容的列表:

(define bounding (make-parameter '()))

;; snip

(when (not (empty? (bounding)))
  (let-values ([(x1 y1 x2 y2) (apply values (bounding))])
    (send pr set-bounding x1 y1 x2 y2)))
在另一个调用上述代码的文件中:

(bounding '(-20 -100 100 2))
以下是错误:

类型检查器:“应用”中函数的参数不正确: 域名:a b。。。B #f* 参数:(列出任何参数)* 在:(应用值(边界))


那么如何将任何的
列表转换为真正的
列表呢?

这里的
应用
函数提供了一个任意长度的列表作为输入,但上下文正好需要4个值。如果列表的长度不是4,它将失败

您的意思似乎是要将
边界
包含空列表或正好包含4个实数的列表

(: bounding : (Parameterof (U Null (List Real Real Real Real))))
(define bounding (make-parameter '()))
然后,每当您的程序测试
(边界)
的内容是否为空,然后依赖于它是一个由4个数字组成的列表时,您需要首先将该值放入局部变量中,以便键入的Racket可以看到
(not(empty?…)
测试和它下面的用法之间的联系

换句话说,转换模式

(if (not (empty? (bounding)))
    (.... (bounding) ....)
    ....)
进入

在您的示例中,该转换提供:

(: bounding : (Parameterof (U Null (List Real Real Real Real))))
(define bounding (make-parameter '()))

....

(let ([bounding-v (bounding)])
   (when (not (empty? bounding-v))
     (let-values ([(x1 y1 x2 y2) (apply values bounding-v)])
       (send pr set-bounding x1 y1 x2 y2))))

我发现我可以使用
ann
函数生成一个空的实数列表,因此:
(定义边界(生成参数(ann'()(Listof Real)))
——但是我仍然得到关于
应用的错误,也许这与
生成参数
有关?
应用
在大多数情况下都不是很聪明。特别是因为您有一个任意长度的列表作为输入,并有固定数量的值(其中4个)作为输出。此外,如果您查看
值的类型,它允许零项或一项或多项,但不允许零项或多项。我会尝试在不使用
(应用值…
)的情况下设计它。如果您使用
(匹配let([(列表x1 y1 x2 y2)(边界)]…)
,它是否有效?
匹配let
有效,非常感谢Alex。
(: bounding : (Parameterof (U Null (List Real Real Real Real))))
(define bounding (make-parameter '()))

....

(let ([bounding-v (bounding)])
   (when (not (empty? bounding-v))
     (let-values ([(x1 y1 x2 y2) (apply values bounding-v)])
       (send pr set-bounding x1 y1 x2 y2))))