Сопоставление шаблонов OCaml с целыми числами

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

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

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

Каков ожидаемый результат? Вы можете использовать when охранников, но, насколько я понимаю, присваивание, по сути, будет просто плохой заменой if-выражения. Поскольку это задание, возможно, оно должно быть надуманным, но вы не до конца разъясняете цель задания, поэтому могут быть какие-то детали, которые придают ему больше смысла.

glennsl 30.05.2019 10:32

На самом деле вы могу объявляете и используете функцию sign — просто сопоставьте (0,0) в качестве первого предложения и сделайте все остальное во втором предложении «поймать все». Это будет уродливое решение, но соответствующее предоставленной заглушке :)

Konstantin Strukov 31.05.2019 11:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
594
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

(я бы никогда так решил задачу в реале)

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

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

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

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

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

с этим решением есть проблема: оно не сможет сопоставить (0,y) и (x,0) для любого отличного от 0 x или y.

Virgile 04.06.2019 18:14

@Virgile Вы абсолютно правы, но этот код не задумывался как полное решение - это просто быстрый (и довольно грязный) набросок, отвечающий на первоначальный вопрос («как подогнать решение к предоставленной заглушке кода»). ..

Konstantin Strukov 04.06.2019 22:49

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

Virgile 05.06.2019 08:57

Другие вопросы по теме