我很难理解如何在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中实现这一目标?
答案 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))