使用 "in" 和 "and" 操作在 ocaml 中传递多个语句

passing multiple statements in ocaml using "in" and "and" operations

我想将此 C++ 代码转换为 ocaml,但出现语法错误

C++代码

int** matrix(int n,int **a,int**b)
{
t=n/2;
a11=new int*[t];
for(i=0;i<t;i++)
    a11[i]=new int [t];
for(i=0;i<t;i++)
    for(j=0;j<t;j++)
        a11[i][j]=a[i][j];

a12=new int*[t];
for(i=0;i<t;i++)
    a12[i]=new int [t];
for(i=0;i<t;i++)
    for(j=0;j<t;j++)
        a12[i][j]=a[i][j+t];

a21=new int*[t];
for(i=0;i<t;i++)
    a21[i]=new int [t];
for(i=0;i<t;i++)
    for(j=0;j<t;j++)
        a21[i][j]=a[i+t][j];
}

Ocaml 代码

let matrix n x y =
let t = n/2 in
        let a11 = Array.make_matrix t t 0 in
        for i = 0 to t-1 do
            for j = 0 to t-1 do
            a11.(i).(j) <- x.(i).(j)
            done
        done            
        and
        a12 = Array.make_matrix t t 0 in
        for i = 0 to t-1 do
            for j = 0 to t-1 do
            a12.(i).(j) <- x.(i).(j+t)
            done
        done        
        and
        a21 = Array.make_matrix t t 0 in
        for i = 0 to t-1 do
            for j = 0 to t-1 do
            a21.(i).(j) <- x.(i+t).(j)
            done
        done
;;

问题是 t 的值没有在 a12 和 a21 数组中传递,而是变得无界。

letand 不能出现在 let 的正文中。相反,使用多个 lets:

let matrix n x y =
  let t = n/2 in
  let a11 = Array.make_matrix t t 0 in
  for i = 0 to t-1 do
    for j = 0 to t-1 do
      a11.(i).(j) <- x.(i).(j)
    done
  done;
  let a12 = Array.make_matrix t t 0 in
  for i = 0 to t-1 do
    for j = 0 to t-1 do
      a12.(i).(j) <- x.(i).(j+t)
    done
  done;
  let a21 = Array.make_matrix t t 0 in
  for i = 0 to t-1 do
    for j = 0 to t-1 do
      a21.(i).(j) <- x.(i+t).(j)
    done
  done

澄清一下,以下问题与您的原始代码相同:

# let x = 4 in () and y = 7 in ();;                
Error: Syntax error

由于let定义了一个表达式,这相当于写() and (),这确实是不合法的OCaml。

let ... and 的正确用法是这样的:

# let x = 4 and y = 7 in ();;
Warning 26: unused variable x.
Warning 26: unused variable y.
- : unit = ()

有几个 let ... and let ... 但只有 一个 in.