在ocaml中编写多行函数

在ocaml中编写多行函数,ocaml,Ocaml,我很难理解如何在ocaml中编写函数,因为我只编写了递归函数,不需要用分隔多行 我试图创建一个函数,给定一个整数n,它返回一个满是零的矩阵,对角线上只有一个,因此一个大小为n的单位矩阵。 我是函数式编程和ocaml的新手,所以我想知道是否可以用命令式的方式编写它。 例如,我将用Java编写: public int[][] identity(int size) { int[][] matrix; matrix = new int[size][size]; //fill th

我很难理解如何在ocaml中编写函数,因为我只编写了递归函数,不需要用
分隔多行

我试图创建一个函数,给定一个整数n,它返回一个满是零的矩阵,对角线上只有一个,因此一个大小为n的单位矩阵。
我是函数式编程和ocaml的新手,所以我想知道是否可以用命令式的方式编写它。 例如,我将用Java编写:

public int[][] identity(int size) {
    int[][] matrix;
    matrix = new int[size][size];
    //fill the matrix with zeroes
    for( int i=0; i<size; i++){
        for( int j=0; j<size; j++){
            matrix[i][j] = 0;
        }
    }
    //diagonal values at 1
    for (int i=0; i<size; i++){
        matrix[i][i] = 1;
    }
    return matrix;
}
public int[][]标识(int size){
int[][]矩阵;
矩阵=新整数[大小][大小];
//用零填充矩阵

对于(int i=0;i您可以用命令式的方式编写OCaml代码,是的。OCaml有矩阵(表示为数组的数组),矩阵是可变的,并且它有一个
for
语句。因此,您可以编写与Java中编写的代码非常相似的代码

然而,学习OCaml只是为了编写命令式代码,这似乎是一种耻辱

以下是一些可以组合在一起的代码片段:

# let m = Array.make_matrix 3 3 0;;
val m : int array array = [|[|0; 0; 0|]; [|0; 0; 0|]; [|0; 0; 0|]|]

# m.(1).(1) <- 1;;
- : unit = ()

# m;;
- : int array array = [|[|0; 0; 0|]; [|0; 1; 0|]; [|0; 0; 0|]|]

# for i = 0 to 9 do Printf.printf " %d" i done;;
 0 1 2 3 4 5 6 7 8 9- : unit = ()

在OCaml中,
用于分离应按顺序计算的表达式。也就是说,在最后一个表达式之后没有

在OCaml中基本上可以这样做:

let identity size =
    let m = Array.make_matrix size size 0 in
    for i = 0 to size - 1 do
        m.(i).(i) <- 1;
    done;
    m
let identity size =
  Array.init
    size
    (fun x ->
       Array.init
         size
         (fun y -> if x = y then 1 else 0))

一、 我也认为用命令式的方式来做不是这种语言最好的方法,但我看不到出路。我现在看到的唯一方法是像你一样创建一个充满零的矩阵,然后创建第二个只改变对角线的函数。我现在没有时间写它,但我想它必须是递归的。谢谢你他提供了帮助和快速回答。由于OCaml数组是可变的,因此处理数组的代码在风格上是必须的。没有办法解决。但是,通过调用
array.init
,您可以用很少的代码创建一个标识数组。您只需要将正确的函数作为参数传递。嘿,谢谢您的回答,最后我成功地实现了这样做,但我完全忘记了为其他人发布答案。想到的第一个解决方案是第一个,但在阅读了Array的文档后,我发现了您发布的“功能性”解决方案。
let identity size =
  Array.init
    size
    (fun x ->
       Array.init
         size
         (fun y -> if x = y then 1 else 0))