Комментарии 4
Скажите почему в AbsDiff[a, b]
не рассмотрен случай двух нулей case (Zero, Zero)
? Мне кажется результатом будет Nothing
или там так задумано?
В измененной реализации его можно будет использовать в Equals[a, b]
. А также можно будет ускорить Threatens[a, b]
посчитав сначала разности по X и Y и затем сравнив их с нулем и между собой.
type AbsDiff[a, b] = (a, b) match
case (S[a1], S[b1]) =>
AbsDiff[a1, b1]
case (S[a1], Zero) =>
S[a1]
case (Zero, S[b1]) =>
S[b1]
case (Zero, Zero) =>
Zero
case _ => Nothing
type Equals[a, b] = AbsDiff(a, b) match
case Zero => True
case _ => False
type Threatens[a, b] =
(a, b) match
case (Queen[ax, ay], Queen[bx, by]) =>
var dx := AbsDiff[ax, bx]; // не знаю синтаксис Scala
var dy := AbsDiff[ay, by]; // не знаю синтаксис Scala
Or[
Or[
Equals[dx, Zero],
Equals[dy, Zero],
],
Equals[dx, dy]
]
case _ => Nothing
+1
Хм, похоже, это ошибка.
Обычно такой случай перехватывается с помощью переменной. Если бы мы были в пространстве значений, было бы так:
...
case (x, 0) => x
В пространстве типов, похоже, тоже работает:
type AbsDiff[a, b] = (a, b) match
case (S[a1], S[b1]) =>
AbsDiff[a1, b1]
case (a, Zero) =>
a
case (Zero, b) =>
b
case _ => Nothing
Предложение с var dx := AbsDiff[ax, bx];
. Я бы тоже так хотел. Но не похоже, что такая возможность предусмотрена.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Решение задачи о 8 ферзях на трёх уровнях Scala — программа, типы, метапрограмма