2014-03-01 3 views
0

우선 코드 :서명 불일치 OCaml의

module type ENV_CORE = 
sig 
type variable 
type 'a environment 
exception Unbound_variable 
val empty : unit -> variable 
val bind : 'a -> 'a environment -> 'a environment 
val unbind : variable -> 'a -> 'a environment -> 'a environment 
val is_bound : variable -> 'a environment -> bool 
val lookup : variable -> 'a environment -> bool 
val fold : (variable -> 'a -> 'b -> 'b) -> 'a environment -> 'b -> 'b 
end;; 


module EnvCoreList : ENV_CORE = 

struct 
    type variable = string list 
    type 'a environment = variable * variable -> 'a 
    exception Unbound_variable 
    let empty() = [] 
    let bind elt l = elt::l 
    let rec unbind elt l = 
     match l with 
     |[] -> raise Unbound_variable 
     |a::r -> if (elt = a) 
      then r 
      else a::(unbind elt r) 
    let rec is_bound elt l = 
     match l with 
     |[] -> raise Unbound_variable 
     |a::r -> if (elt = a) 
      then true 
      else is_bound elt r 
    let rec lookup elt l = 
     match l with 
     |[] -> false 
     |a::r -> if (elt = a) 
      then true 
      else lookup elt r 
    let rec fold f rho gamma = 
     match rho with 
     |[] -> gamma 
     |a::r -> f a (fold f r gamma) 
end;; 

나는 그것을 컴파일 내가받을 다음과 같은 오류 :

Error: Signature mismatch: 
    Modules do not match: 
    sig 
     type variable = string list 
     type 'a environment = variable * variable -> 'a 
     exception Unbound_variable 
     val empty : unit -> 'a list 
     val bind : 'a -> 'a list -> 'a list 
     val unbind : 'a -> 'a list -> 'a list 
     val is_bound : 'a -> 'a list -> bool 
     val lookup : 'a -> 'a list -> bool 
     val fold : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b 
    end 
    is not included in 
    ENV_CORE 
    Values do not match: 
    val bind : 'a -> 'a list -> 'a list 
    is not included in 
    val bind : 'a -> 'a environment -> 'a environment 

내가 이해하지 못하는 것은 더 구체적인 유형이 포함되어 있지 않습니다 어떻게 좀 더 일반적인 유형입니까? 나는이 문제를 해결할 수 있었던 비슷한 질문을 찾지 못했습니다. 고축

답변

0

유형 'a list'a environment 사이에는 명확한 관계가 없습니다. 나는 왜 당신이 다른 것보다 더 일반적이 될지 고려하지 않을 것입니다.

귀하의 구현에서 environment의 정의를 변경하거나 environment으로 지정한 유형에서 작동하도록 bind을 다시 작성해야합니다.

+0

심장'ENV_CORE' 환경에 대한 서명과 연관 목록이있는 환경을 구현하는 모듈 ('EnvCoreList : ENV_CORE')을 작성해야합니다 – user3368964