为什么这不会在球拍中生成矩阵?

Why does this not generate a matrix in racket?

我想在 racket 中生成一个矩阵(可能使用来自进程的数字,使用 0 进行简化,如下所示)。我试过了

(array (for/vector ((x (range 4)))
           (for/vector ((y (range 4)))
             0)))

这给出了

(array '#(#(0 0 0 0) #(0 0 0 0) #(0 0 0 0) #(0 0 0 0)))

虽然够傻,

(matrix? (array (for/vector ((x (range 4)))
           (for/vector ((y (range 4)))
             0))))

给出#f(array '#(#(0 0 0 0) #(0 0 0 0) #(0 0 0 0) #(0 0 0 0)))也是如此。然而

> (matrix? (array #(#(0 0 0 0) #(0 0 0 0) #(0 0 0 0) #(0 0 0 0))))
#t

那么它到底出了什么问题?


编辑:矩阵模块是从 math/arraymath/matrix 导入的。

array 特殊形式定义了一种新语法,根据 docs 它期望“表达式的嵌套行”作为其参数,这与 vector 不同.例如:

(require math/array)
(require math/matrix)

(array #[#[1]])
=> (array #[#[1]])
(matrix? (array #[#[1]]))
=> #t

(array (vector (vector 1)))
; notice the difference, there's a quote and the brackets are not square
=> (array '#(#(1)))
(matrix? (array (vector (vector 1))))
=> #f

总而言之:您不能使用向量的向量来替代 array 要求的特殊语法作为其参数。这不仅仅是删除引号和使用方括号的问题,它们是不同类型的对象,即使它们在打印时看起来很相似。

array 是一些我不明白的特殊魔法,但它的主体根本不是通用表达式。如果你想以编程方式创建一个数组,你需要像 build-arrayvector*->array:

这样的东西
(define nvs (for/vector ((x (range 4)))
              (for/vector ((y (range 4)))
                0)))

(define a (vector*->array nvs number?))