Если я попытаюсь написать параметризованный модуль, который вызывает =
по неуказанному типу, предоставленному параметром, SML/NJ выдает ошибку типа. Например, если у меня есть подписьЕсть ли способ ограничения сигнатуры параметра функтора, чтобы параметр мог предоставлять неопределенные типы равенства структуре?
signature SIG =
sig
type t
end
и попытаться параметрирования модуль F
над модулем S
с подписью SIG
functor F (S : SIG) =
struct
fun f (x:S.t) (y:S.t) = (x = y)
end
I вызовет следующую ошибку компиляции:
Error: operator and operand don't agree [equality type required]
operator domain: ''Z * ''Z
operand: S.t * S.t
in expression:
x = y
Как я могу указать, что S.t
должен быть типом равенства?
Единственный способ решения проблемы я смог выяснить до сих пор является также поставить функцию равенства в структуре, над которой функтор спараметрирован т.е.
signature SIG' =
sig
type t
val eq : (''a * ''a) -> bool
end
functor F' (S' : SIG') =
struct
fun f' x y = S'.eq (x, y)
end
structure A = F'(struct
type t = int
val eq = (op =)
end)
Похоже, что должно быть лучше , хотя я также могу не понимать что-то основное и важное о том, как функторы должны работать.
O Jeez! Я не знаю, как раньше я никогда не сталкивался с этим ключевым словом! Я не должен отлично читать документацию. Спасибо! –