2015-11-28 17 views
6

Parametre tarafından sağlanan belirtilmemiş bir türde = çağıran bir parametreli modül yazmaya çalışırsam, SML/NJ bir tür hatası atar.Bir functor parametresi imzasını kısıtlamak için bir yol var mı, böylece parametre bir yapıya belirtilmemiş eşitlik türleri sağlayabilir mi?

Error: operator and operand don't agree [equality type required] 
    operator domain: ''Z * ''Z 
    operand:   S.t * S.t 
    in expression: 
    x = y 
: Bir imza

signature SIG = 
sig 
    type t 
end 

ve imzalı bir modül S üzerinde bir modül F parametreleyebilir çalışırsanız Örneğin, SIG

functor F (S : SIG) = 
struct 
    fun f (x:S.t) (y:S.t) = (x = y) 
end 

aşağıdaki derleme hatası tetikleyecektir

S.t'un bir eşitlik türü olması gerektiğini nasıl belirleyebilirim?

şimdiye kadar da yapısında eşitlik işlevini temin etmektir anlamaya mümkün olmuştur tek geçici çözüm, üzerinde funktor parametrelenmiştir yani: Daha iyi bir yolu olmalı gibi

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) 

görünüyor Her ne kadar, functor'ların nasıl çalışması gerektiğine dair temel ve önemli bir şeyi yanlış anlamayabilirim.

cevap

6

Yalnızca t bir eqtype olduğunu belirtmek gerekir:

signature SIG = 
sig 
    eqtype t 
end 
+1

Ey Tanrım! Daha önce bu anahtar kelime ile nasıl karşılaştığımı bilmiyorum! Belgeleri okumak için mükemmel bir iş yapmamalıyım. Teşekkür ederim! –

İlgili konular