SML равенство пользовательских типов данных без polyEqual - PullRequest
2 голосов
/ 18 ноября 2011

Я пытаюсь написать функцию для проверки на равенство типов, игнорируя переменные экземпляра (не уверен, что это правильная терминология для SML). Предпочтительно эта функция может работать с несколькими типами данных.

Итак, если у меня есть:

тип данных D = A | B int;

myEqual A A, myEqual (B 1) (B 1) и myEqual (B 1) (B 2) все вернут истину, а myEqual A (B 1) вернет ложь.

Моей первой мыслью было реализовать его как-то вроде fun myEqual a b = a = b;. Тем не менее, это сравнивает переменные экземпляра обеих переменных, а это не то, что мне нужно, поэтому myEqual (B 1) (B 2) вернет false.

Я знаю, что это может быть реализовано в этом случае с использованием сопоставления с шаблоном, как

fun myEqual (B _) (B _) = true
  | myEqual A A = true
  | myEqual _ _ = false;

Но это работает только для этого конкретного типа данных.

Есть ли в SML какие-либо операции для проверки только на равенство типов, но не на переменные экземпляра?

1 Ответ

4 голосов
/ 18 ноября 2011

Прежде всего, datatype D = A | B of int; - это всего лишь один тип с двумя ветвями. Итак, вы сравниваете сравнение различных форм в разных ветвях. Я думаю, что вы должны разложить типы данных, чтобы написать такие функции сравнения. Поэтому написание функции myEqual для каждого типа данных является естественным.

Во-вторых, если вы хотите поговорить о двух независимых типах данных, такое сравнение не имеет смысла. Поскольку SML является статической и строгой типизацией, вы знаете конкретный тип каждой переменной во время компиляции.

...