Напишите многострочную функцию в ocaml - PullRequest
0 голосов
/ 11 октября 2018

У меня возникают проблемы с пониманием того, как писать функции в 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;
}

Как мне добиться этого в ocaml?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вы можете сделать это в основном таким же образом в 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))
0 голосов
/ 11 октября 2018

Вы можете написать код 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 ; используется для отдельных выражений, которые должны оцениваться по порядку.Т.е. после последнего выражения нет ;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...