在ocaml中编写多行函数

时间:2018-10-11 16:50:11

标签: ocaml

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

我正在尝试创建一个给定int数n的函数,该函数返回一个全为零且对角线为1的矩阵,因此大小为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;
}

如何在ocaml中实现这一目标?

2 个答案:

答案 0 :(得分:1)

可以,您可以用强制性的方式编写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中的多行功能没有什么特别的。这是一个完成三件事的函数。您可以将其写成一行或多行:

let f x =
    Printf.printf "I will now write the value of x\n";
    Printf.printf "Here is the value of x: %d\n" x;
    Printf.printf "I just wrote the value of x\n"

在OCaml中,;用于分隔应当按顺序求值的表达式。也就是说,最后一个表达式之后没有;

答案 1 :(得分:1)

您可以在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

ocaml的不同之处在于您必须创建一个填充有某种东西的矩阵(在这种情况下为0)。因此,第一个将条目设置为0的循环消失了,因为Array.make_matrix在内部执行了此操作。没有办法初始化它。然后将对角线更改为1。

另一种方法是首先使用正确的值初始化矩阵。您也可以这样做:

let identity size =
  Array.init
    size
    (fun x ->
       Array.init
         size
         (fun y -> if x = y then 1 else 0))