2015-11-28 7 views
6

Если я попытаюсь написать параметризованный модуль, который вызывает = по неуказанному типу, предоставленному параметром, 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) 

Похоже, что должно быть лучше , хотя я также могу не понимать что-то основное и важное о том, как функторы должны работать.

ответ

6

Вам нужно только указать, что t является eqtype:

signature SIG = 
sig 
    eqtype t 
end 
+1

O Jeez! Я не знаю, как раньше я никогда не сталкивался с этим ключевым словом! Я не должен отлично читать документацию. Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^