Array.set не является функцией и не может быть применен - PullRequest
0 голосов
/ 27 января 2020

Мне нужно сделать функцию, которая превращает случайный пиксель на изображении в черный. Картинка представлена ​​в виде множества цветов, представленных в черном или белом цвете. Вот мой код:

type color = Black | White
;;

type picture = color array array
;;

let rec color_rand_point (img : picture) : picture =
  let randx = ref (Random.int (Array.length img))
  and randy = ref (Random.int (Array.length img)) in
  if (img.(!randx).(!randy) = White)then
    begin
      Array.set img.(!randx) (!randy) Black;
    end
    img
  else
    color_rand_point(img)
;;

Вот результат, который я получаю, когда пытаюсь скомпилировать:

                  Lines 5-7, characters 4-7:
5 | ....begin
6 |       Array.set img.(!randx) (!randy) Black;
7 |     end
Error: This expression has type unit
       This is not a function; it cannot be applied.
# 

Я почти уверен, что ответ будет очевиден для всех, кто разбирается в ocaml и что это плохой стиль, но я работаю над этим, будучи студентом, и понятия не имею о том, что я делаю с ocaml. Мы не изучали основы глубоко, поэтому я хотел бы получить простой ответ, если это возможно.

Я понятия не имею, почему Array.set не рассматривается как функция, применимая в императивном блоке c.

1 Ответ

0 голосов
/ 27 января 2020

Сообщение об ошибке указывает не на Array.set, а на блок begin ... end, который оценивается как unit, поскольку Array.set, единственное выражение внутри блока, возвращает unit.

Проблема в том, что img находится вне блока и не разделен точкой с запятой, поэтому вы фактически указываете компилятору передать img в качестве аргумента тому, что блок begin ... end вычисляет. Это unit, а не функция, как говорится в сообщении об ошибке.

Ошибка может быть исправлена ​​простым перемещением img внутри блока.

...