Сравнение с OCaml по целым числам - PullRequest
0 голосов
/ 30 мая 2019

У меня есть назначение для заполнения следующей заглушки кода:

let quad (x,y) = 
  match (x,y) with 
  | ... -> ...
  ...

, где функция quad должна принимать кортеж целых чисел в качестве аргумента и возвращать алгебраический тип данных, представляющийКвадрант, в котором лежат координаты. Я точно знаю, как это сделать, используя предложения if, но как можно это сделать, используя сопоставление?Есть ли способ сопоставить целые числа с их знаком?Я знаю, что мог бы даже сделать это путем сопоставления со значением функции знака.Я мог бы написать функцию sign, такую, что sign 10 = 1 и sign (-10) = -1 и так далее, и затем сопоставить эти значения, но в соответствии с заглушкой кода я даже не должен был этого делать.Любой намек на то, как это сделать?Должен ли я сопоставлять только 0, а затем, если это не 0, использовать if-предложения после ->?Или есть какое-то использование соответствия, которое может обнаружить положительные и отрицательные целые числа?

1 Ответ

1 голос
/ 31 мая 2019

Уродливое решение, но подходит для заглушки кода :)

let quad (x,y) = 
  match (x,y) with 
  | (0, 0) -> `Center
  | _ -> begin
    let sign = function
      | 0 -> 0
      | x -> if x < 0 then -1 else 1
    in
    match (sign x), (sign y) with
    | -1, -1 -> `LeftBottom
    | -1, 1 -> `LeftTop
    | 1, -1 -> `RightBottom
    | 1, 1 -> `RightTop
  end

(я бы никогда не решил бы задачу таким способом в реальной жизни)

UPD.Как упоминалось в комментариях @Virgile, приведенный выше код не является полным.Существует случай ребра, который не обрабатывается должным образом: когда точка принадлежит оси x или y (например, только одна из ее координат равна нулю).Эти случаи, очевидно, могут быть сопоставлены либо во внешнем match

...
| (0, _) -> `YAxis
| (_, 0) -> `XAxis
...

, либо во внутреннем match с такими предложениями, как

| 0, -1 | 0, 1 -> `YAxis
...

(или даже более подробно, еслинеобходимо - с разными вариантами для положительной и отрицательной полуоси)

...