此表达式的类型为 'a -> 'a 数组 array,但表达式应为 'b 数组类型

问题描述 投票:0回答:1

如何在 Ocaml 中正确操作矩阵? 当为矩阵上的位置分配值时,我错过了什么?

let dynamic arraymoedas valor len =
    let arrayAux = Array.make_matrix (len+1) (len+1) in
    for i=0 to len+1 do
        arrayAux.(i).(0)=0;
    done;
    for j=0 to valor+1 do
        arrayAux.(0).(j)= max_int 
    done;
    for i=1 to len+1 do
        for j=1 to len+1 do
            if(arraymoedas.(i-j) > j) then
                arrayAux.(i).(j) = arrayAux.(i - 1).(j)
            else
                arrayAux.(i).(j) = min (1+arrayAux.(i).(j-arraymoedas.(i - 1))) arrayAux.(i-1).(j)

        done;
    done;
    !arrayAux

错误:

File "Novo_func.ml", line 38, characters 8-16:
38 |         arrayAux.(i)(0)=0;
             ^^^^^^^^
Error: This expression has type 'a -> 'a array array
       but an expression was expected of type 'b array
dynamic ocaml
1个回答
1
投票

正如评论中所指出的,您编写的代码存在三个问题。

首先,您没有正确使用

Array.make_matrix
。该函数的类型为
int -> int -> 'a -> 'a array array
。您只提供了尺寸,但没有提供默认值。当你这样做时,你会得到一个接受默认值并返回一个数组的函数。

# Array.make_matrix 2 3;;
- : '_weak1 -> `_weak1 array array = <fun>

这也会带来值限制的问题。

其次,修改数组中的值时,使用

<-
而不是
=
。您想使用
arrayAux.(0).(j) = max_int
而不是
arrayAux.(0).(j) <- max_int

第三,在

dynamic
函数末尾,您使用
!
运算符来解引用
arrayAux
。问题在于
arrayAux
不是参考。这将由于类型不匹配而导致编译器错误。

© www.soinside.com 2019 - 2024. All rights reserved.