Как исследовать предметы в "наборе" без оператора "против"
Это один из примеров кода, который, я думаю, отлично работает в заданном типе данных, реализованном в виде списка:
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.