У меня есть задание заполнить следующий код:
let quad (x,y) =
match (x,y) with
| ... -> ...
...
где функция quad
должна принимать кортеж целых чисел в качестве аргумента и возвращать алгебраический тип данных, представляющий квадрант, в котором лежат координаты. Я точно знаю, как это сделать, используя операторы if, но как это сделать, используя соответствие? Есть ли способ сопоставить целые числа с их знаком? Я знаю, что мог бы даже сделать это, сопоставив значение знаковой функции. Я мог бы написать функцию sign
, такую, что sign 10 = 1
и sign (-10) = -1
и так далее, а затем сопоставить эти значения, но, согласно заготовке кода, я даже этого делать не должен. Любая подсказка о том, как это сделать? Должен ли я выполнять сопоставление только с 0, а затем, если это не 0, использовать операторы if после ->
? Или есть какое-то использование сопоставления, которое может обнаруживать положительные и отрицательные целые числа?
На самом деле вы могу объявляете и используете функцию sign
— просто сопоставьте (0,0) в качестве первого предложения и сделайте все остальное во втором предложении «поймать все». Это будет уродливое решение, но соответствующее предоставленной заглушке :)
Уродливое решение, но подходит к заглушке кода :)
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 Вы абсолютно правы, но этот код не задумывался как полное решение - это просто быстрый (и довольно грязный) набросок, отвечающий на первоначальный вопрос («как подогнать решение к предоставленной заглушке кода»). ..
Конечно, мой комментарий был в основном адресован тому, у кого возникнет соблазн скопировать и вставить ваш код, не задумываясь об этом (я также полностью согласен с вашим утверждением, что это очень надуманный способ решения задачи, который не следует использовать в реальной жизни). жизнь).
Каков ожидаемый результат? Вы можете использовать
when
охранников, но, насколько я понимаю, присваивание, по сути, будет просто плохой заменой if-выражения. Поскольку это задание, возможно, оно должно быть надуманным, но вы не до конца разъясняете цель задания, поэтому могут быть какие-то детали, которые придают ему больше смысла.