首页 > 解决方案 > 此表达式的类型为 'a -> 'a 数组数组,但表达式应为 'b 数组类型

问题描述

如何在 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

标签: dynamicocaml

解决方案


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

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

其次,在修改数组中的值时,使用<-代替=. 而不是arrayAux.(0).(j) = max_int你想使用arrayAux.(0).(j) <- max_int.

第三,在dynamic函数结束时,您正在使用!运算符 deref arrayAux。问题在于这arrayAux不是参考。由于类型不匹配,这将导致编译器错误。


推荐阅读