В прошлом я немного поработал на SML, но теперь я начинаю заниматься более интересными частями.
Используя конструкцию abstype...with...end
, я могу создавать вещи, но не скрывать их детали реализации. Я также могу создать подпись того, что я хочу сделать, и использовать оператор :>
, чтобы сделать структуру, придерживающуюся этой подписи, которая скрывает детали реализации.
Не являются ли подписи/структуры просто более общей версией abstypes? Что я могу сделать с абстипами, которые я не могу сделать с сигнатурами/структурами? Почему я хотел бы использовать abstype?
Заранее благодарим за помощь!
В качестве примера:
signature SET = sig
type set
val empty: set
val insert: int * set -> set
val member: int * set -> bool
end
structure Set :> SET = struct
type set = int list
val empty = []
fun insert(x, s) = x::s
fun member(x, []) = false
| member(x, h::t) = (x = h) orelse member(x, t)
end
кажется, по крайней мере, столь же мощным, как
abstype AbsSet = absset of int list with
val empty = absset([])
fun insert(x, absset(s)) = absset(x::s)
fun member(x, absset([])) = false
| member(x, absset(h::t)) = (x = h) orelse member(x, absset(t))
end