Как исследовать предметы в "наборе" без оператора "против"

Это один из примеров кода, который, я думаю, отлично работает в заданном типе данных, реализованном в виде списка:

fun newSet() = nilset;

fun isMember (k, x::xs) = if k = x then true else isMember (k, xs)
  | isMember (k, nilset) = false;

Проблема в том, что я не могу реализовать его в виде списка. Ниже приведен код для реализации моего набора.

abstype ''a set = nilset | st of ''a * ''a set

Как я могу рекурсивно сделать это и другие операции над множествами, если :: это для списков? Если это не так, почему это исключение? Я получаю это, когда я использую :::

! Type clash: pattern of type
!   ''a set
! cannot have type
!   ''b list

Спасибо за любую помощь.

1 ответ

Решение

Это не исключение; это ошибка типа, говорящая о том, что вы не можете использовать конструктор cons :: принадлежность к 'a list с 'a set,

Предполагая, что у вас есть два конструктора Nilset а также Set в рекурсивном типе данных:

datatype 'a set = Nilset | Set of 'a * 'a set

Вы должны следовать рекурсивной структуре вашего типа данных, чтобы определить isMember:

fun isMember (k, Set(x, xs)) = k = x orelse isMember (k, xs)
  | isMember (k, Nilset) = false

Конечно, для серьезного использования Set, вы должны посмотреть в структуру Set.

Другие вопросы по тегам