Pull to refresh

Comments 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

Хм, похоже, это ошибка.
Обычно такой случай перехватывается с помощью переменной. Если бы мы были в пространстве значений, было бы так:

...
  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];. Я бы тоже так хотел. Но не похоже, что такая возможность предусмотрена.

Можно переписать через сопоставление

type Threatens[a, b] = (a, b) match
  case (Queen[ax, ay], Queen[bx, by]) =>
    (AbsDiff[ax, bx], AbsDiff[ay, by]) match
      case (Zero, _)      => True
      case (_, Zero)      => True
      case (dx, dy) => Equals[dx, dy]
  case _ => Nothing

Sign up to leave a comment.

Articles