gpt4 book ai didi

types - 为 typed/racket 中的向量定义 "minus function"

转载 作者:行者123 更新时间:2023-12-02 09:32:19 24 4
gpt4 key购买 nike

Racket 新手。我一直在尝试制作一个简单的向量结构并定义常见的向量函数(点积、范数...)。我了解数学/矩阵,但现在不想使用它。

一切都很顺利,直到我尝试创建一个“减函数”来减去向量。加法函数工作正常,但减法会引发类型检查错误。代码如下:

#lang typed/racket

(struct: vect ([x : Real]
[y : Real])
#:transparent)

(: vect+ (-> vect * vect))
(define (vect+ . vs)
(vect (apply + (map vect-x vs))
(apply + (map vect-y vs))))

(: vect- (-> vect * vect))
(define (vect- . vs)
(vect (apply - (map vect-x vs))
(apply - (map vect-y vs))))

(vect+ (vect 1 2) (vect -3 1) (vect 0 4))

(vect- (vect 1 2) (vect -3 1) (vect 0 4))

vect+(向量加法)函数工作正常,但 vect- 函数会引发:

. Type Checker: Bad arguments to function in `apply':
Domains: Number Number *
Arguments: (Listof Real) *
in: (apply - (map vect-x vs))
. Type Checker: Bad arguments to function in `apply':
Domains: Number Number *
Arguments: (Listof Real) *
in: (apply - (map vect-y vs))
. Type Checker: Summary: 2 errors encountered in:
(apply - (map vect-x vs))
(apply - (map vect-y vs))

当“加”接受实数并且下面的行工作正常时,为什么“减”会拒绝实数?

    (apply - (list 1 2 3))
; -> -4

最佳答案

该错误是因为 apply 期望其第一个参数是接受零个或多个参数的函数,但 - 需要一个或多个参数(注意+ 之所以有效,是因为它接受零个参数)。

> (:print-type apply)
(All (a b) (-> (-> a * b) (Listof a) b))
> (:print-type -)
; big output omitted,
; but notice it includes (-> Number Number * Number),
; but not (-> Number * Number))
> (-)
. Type Checker: could not apply function;
wrong number of arguments provided
expected at least: 1
given: 0 in: (-)
> (+)
- : Integer [more precisely: Zero]
0

要解决此问题,您可以cast apply 到接受一个或多个函数作为其第一个参数的函数:

(: vect- (-> vect vect * vect))
(define (vect- . vs)
(define apply1+
(cast apply (All (a b) (-> (-> a a * b) (Listof a) b))))
(vect (apply1+ - (map vect-x vs))
(apply1+ - (map vect-y vs))))

(vect- (vect 1 2) (vect -3 1) (vect 0 4)) ; (vect 4 -3)

确保相应地更新 vect- 的类型。

或者,您可以定义一个接受零参数的替代减法函数:

(: new- (-> Real * Real))
(define (new- . args)
(if (empty? args)
0
(apply - args)))

(: vect- (-> vect * vect))
(define (vect- . vs)
(vect (apply new- (map vect-x vs))
(apply new- (map vect-y vs))))

在这里,可以给 vect- 零个参数。

关于types - 为 typed/racket 中的向量定义 "minus function",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31677126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com