Уродливое решение, но подходит для заглушки кода :)
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
...
(или даже более подробно, еслинеобходимо - с разными вариантами для положительной и отрицательной полуоси)