Это упражнение, которое я составил, призвано помочь мне понять сигнатуры, структуры и функторы в стандартном машинном обучении. Кажется, я не могу заставить его работать. Для справки я использую
Standard ML of New Jersey v110.75 [built: Sun Jan 20 21:55:21 2013]
У меня есть следующая подпись ML для «объекта, для которого вы можете вычислить величину»:
signature MAG_OBJ =
sig
type object
val mag : object -> int
end
Если я хочу дать структуру «наборов int с величиной», я мог бы иметь структуру для упорядоченного int для использования с подписью ORD_SET стандартной библиотеки следующим образом:
structure OrderedInt : ORD_KEY =
struct
type ord_key = int
val compare = Int.compare
end
Затем я могу создать функтор, чтобы дать мне структуру с желаемыми типами и свойствами:
functor MakeMagSet(structure ELT : ORD_KEY) : MAG_OBJ =
struct
structure Set : ORD_SET = RedBlackSetFn(ELT)
type object = Set.set
val mag = Set.numItems
end
Пока все хорошо (по крайней мере, все компилируется). Теперь я создаю экземпляр структуры для моей структуры OrderedInt, которую я сделал выше:
structure IntMagSet = MakeMagSet(structure ELT = OrderedInt)
Но когда я пытаюсь его использовать (создать набор и вычислить его величину), я получаю сообщение об ошибке:
val X = IntMagSet.Set.addList(IntMagSet.Set.empty, [0,1,2,3,4,5,6,7,8,9])
выдает ошибку:
Error: unbound structure: Set in path IntMagSet.Set.empty.addList
Насколько я понимаю, приписывание подписи непрозрачно с помощью:> делает так, что нельзя получить доступ к каким-либо внутренним элементам структуры, которые не определены явно в подписи, но я приписал MAG_OBJ прозрачно, поэтому я должен иметь доступ к структуре Set, верно ? Что мне здесь не хватает?
[РЕДАКТИРОВАТЬ]
Даже переписывать функтор для привязки функций, которые я хочу, к структуре бесполезно:
functor MakeMagSet(structure ELT: ORD_KEY) : MAG_OBJ =
struct
structure Set : ORD_SET = RedBlackSetFn(ELT)
type object = Set.set
val mag = Set.numItems
val empty = Set.empty
val addList = Set.addList
end
Попытки получить доступ к пустым и addList дают несвязанные переменные ошибки.
С другой стороны, попытка явно определить структуру Set вне структуры и использовать ее функции дает ошибку типа при вызове mag:
Error: operator and operand don't agree [tycon mismatch]
operator domain: IntMagSet.object
operand: Set.set
in expression:
IntMagSet.mag X