использовал ignore для передачи компилятора - PullRequest
0 голосов
/ 17 января 2012

Это функция, которую я вычислил, класс эквивалентности представляет собой набор элементов, которые все эквивалентны.Предполагается вместо этого перебирать все записи в столбце матрицы;вычислить класс эквивалентности с рефлексивными отношениями и проверить оба направления

let eq_class m i =
  let column = m.(i)
  and set = ref [] in
  Array.iteri begin fun j l ->
    if j = i || column.(j) && m.(j).(i) then
      set := j :: !set else ignore l
  end column;
  !set;;

Не могли бы вы объяснить для меня о l, я должен был использовать ignore для прохождения компилятора.Как я могу написать эту функцию правильно на l без использования ignore?

1 Ответ

8 голосов
/ 17 января 2012

Вы можете заменить ignore l на (): он имеет тот же тип и делает то же самое (ничего).

Выражение в ветви else должно иметь тот же тип, что и выражение в ветви then, а тип выражения в ветви then равен unit.

Кроме того, существует сокращенная удобная конструкция для if condition then expression else ().Более короткая эквивалентная конструкция - if condition then expression, которую вы можете использовать в своей программе:

let eq_class m i =
  let column = m.(i)
  and set = ref [] in
  Array.iteri begin fun j l ->
    if j = i || column.(j) && m.(j).(i) then
      set := j :: !set
  end column;
  !set;;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...