2013-10-24 2 views
0

구현을 전환 할 수있는 다른 구조체를 기반으로 구조체를 만들고 싶습니다.폴리/ML 매개 변수 구조체 값 구성

signature Field = 
sig 
    type field_type; 
    val zero : field_type; 
    val add : (field_type * field_type) -> field_type; 
    val f : int -> field_type; 
end; 

structure Reals :> Field = 
struct 
    type field_type = real; 
    val zero = 0.0; 
    fun add (x,y) = x + y; 
    fun f x = Real.fromInt(x); 
end; 

structure Rat :> Field = 
struct 
    type field_type = int * int; 
    val zero = (0, 1); 
    fun add ((i1,i2),(j1,j2)) = (i1*j2 + j1*i2, i2*j2); 
    fun f x = (x, 1); 
end; 

functor Useable(F : Field) = 
struct 
    type field_type = F.field_type; 
    val zero = F.zero; 
    fun add(x,y) = F.add(x,y); 
    fun f x = F.f x; 
end; 

structure ReF = Useable(Reals); 
structure RaF = Useable(Rat); 

아이디어는 필드 (Reals 또는 Rat, 비효율적 인 구현 무시)의 구현을 연결할 수 있다는 것입니다.

는이 코드 ReF.add(ReF.zero, ReF,zero)를 실행할 수 있습니다,하지만 난 생성자 f: int -> field_types를 만들어이 문제를 극복하기 위해 ReF.add(0.0, 0.0) (또는 RaF.add((0,1),(0,1)))

를 실행할 수 없습니다,하지만 난이 그리 우아하고도 성가신 것으로 판명. ReF.add(0.0, 0.0)을 (를) 사용할 수 있도록 무엇인가 할 수 있습니까?

답변

2

간단한 대답은 투명 서명 제약

structure Reals : Field 

보다는 불투명 한 제약 조건을 사용하는 것입니다.

structure Reals :> Field 

당신이 서명에 같은 field_type이를 구현하는 데 사용되는 종류의 구별 새로운 형태로 만들어집니다 불투명 한 제약 조건 유형을 사용

. 원래 유형에 대한 링크를 유지하려면 투명한 제한 조건을 사용해야합니다. 당신이 완벽하게

ReF.add(0.0, 0.0); 

을 사용할 수 있도록 투명한 제약 Reals.field_type실제와 같은 유형입니다. 당신은 당신이 새로운 유형으로 만들려 서명의 다른 유형이있는 경우, 당신은 여전히 ​​곳과 함께 불투명 제약 조건을 사용하여 원하는 효과를 얻을 수 있습니다, 투명한 제약 조건을 사용하는 대신

> ReF.add(0.0, 0.0); 
val it = 0.0: real 

을 입력하십시오.

structure Reals :> Field where type field_type = real