2016-09-27 5 views
2

펑터의 결과에서 형식을 파생하는 구조에서 사용되는 서명의 형식을 어떻게 참조 할 수 있습니까? 다음은 폴리 인터프리터를 사용하는 예입니다.서명에 펑터의 결과가 포함 된 형식을 참조합니다.

> signature Res = sig type f end; 
signature Res = sig type f end 
> functor F (A: sig type t end) : Res = struct datatype f = None | Some end; 
functor F (A: sig type t end): Res 
> structure S = struct local structure A = F(struct type t = int end) in type t = A.f list end end; 
structure S: sig type t = A.f list end 

우선 구조체에 로컬 인 경우 A.f가 결과 서명에 나타나는 이유를 알 수 없습니다. 둘째, 어떻게이 구조 S와 일치하는 서명을 만들 수 있습니까?

이런 식으로 뭔가가 작동하지 않습니다

signature SSig = sig type t = F(struct type t = int end).t list end 

을 또한, F 형 대신 데이터 형식의 INT 경우, 어떻게 든 궁극적으로 f는 대신이 서명에 의해 숨겨진되고 지능이 있음을 알게 될 S . 불투명 한 시그니처를 사용하더라도 int가 표시되지 않더라도 합리적인 동작처럼 보이지 않습니다.

> functor F (A: sig type t end) : Res = struct type f = int end; 
functor F (A: sig type t end): Res 
> structure S = struct local structure A = F(struct type t = int end) in type t = A.f list end end; 
structure S: sig type t = int list end 
> functor F(A: sig type t end):> Res = struct type f = int end; 
functor F (A: sig type t end): Res 
> structure S = struct local structure A = F(struct type t = int end) in type t = A.f list end end; 
structure S: sig type t = A.f list end 

답변

2

첫 번째 질문에 대한 답변이 없으므로 그 점에 대해서는 언급하지 않겠습니다. Andreas Rossberg가 거기에있는 것들을 분명히 해줄 것입니다.

두 번째 질문에 관해서. 왜 서명 안에서 펑터를 인스턴스화 할 것인지 이해하지 못합니다. 너 이거 원하는거야?

signature Res = 
    sig 
    type f 
    end 

signature SSig = 
    sig 
    structure R : Res 
    type t = R.f list 
    end 

그리고, 누구든지 SSig를 구현하는 것은 R 하위 구조에 F를 호출 한 결과를 할당 무료입니다.

마지막 지점에 관해서. 불투명하게 서명을 구현하지 않으면 유형이 숨겨지지 않습니다.

+0

나는 이것을해야 할지도 모른다고 걱정했다. 문제는 SSig에서 타입 t를 불투명하게하고 싶지는 않지만, 소비자가 그것에 접근하기를 원하지 않기 때문에 서명에 R을 포함하고 싶지 않다는 것입니다. 나는 불투명 한 타입의 f = R.f로 비슷한 일을 할 수 있었지만 서명에 그것을 포함 시켜야만했고 서명이 더러워졌습니다. 마지막으로, Res는 f의 타입 정의를 제공하지 않기 때문에 혼란 스러웠습니다. 하지만 F가 불투명 한 서명을 사용하지 않았기 때문에 SML이 S에서 사용할 수있는 것을 꺼낼 수 있다고 생각합니다. – eatonphil

1

[...] A.f가 구조체에 대해 로컬 인 경우 A.f가 결과 서명에 표시되는 이유는 무엇입니까?

이것은 Poly/ML의 아티팩트 인 것으로 보입니다. Moscow ML 이름을 누설하지 않는 것 :

나는 펑터의 결과에서 유형을 생성하는 구조에 사용되는 서명의 형식을 참조 할 수있는 방법
Moscow ML version 2.10 
Enter `quit();' to quit. 
- signature Res = sig type f end; 
> signature Res = /\f.{type f = f} 
- functor F (A: sig type t end) : Res = 
    struct 
    datatype f = None | Some 
    end; 
> functor F : !t.{type t = t}->?=f.{type f = f} 
- structure S = 
    struct 
    local structure A = F(struct type t = int end) 
    in type t = A.f list 
    end 
    end; 
> New type names: =f 
    structure S : {type t = f list} 

?

(설명) 문제는 SSig에서 유형 t를 불투명하게 만들고 싶지는 않지만 소비자가 액세스하지 못하도록하기 위해 서명에 R을 포함하고 싶지 않다는 것입니다. 그것에. 나는 불투명 한 타입의 f = R.f로 비슷한 일을 할 수 있었지만 서명에 그것을 포함 시켜야만했고 서명이 더러워졌습니다.

how to decide whether to parameterize on the type-level or the module-level when designing modules의 Drup의 최근 답변은 모듈의 입력 유형을 단조화하는 단점에 대해 설명합니다.

"SSig의 불투명 만들기"및 "SSig 서명의 R 포함 안함"은 모든 R이 포함될 때와 동일합니까? 아마도 Res에는 유형 t보다 많은 것이 포함되어 있습니다.이 경우 대신 structure R : sig type t end을 제공 할 수 있습니다. 아니면 누트의 대답이 변화는 바람직하다 :

signature Res = 
sig 
    type t (* rather than structure R *) 
    type f = t list 
end 

functor F (A : sig type t end) : Res = 
struct 
    type t = A.t 
    type f = t list 
end 

structure S = F(struct type t = int end) 

나는 type f = t list의 중복을 방지하는 방법의 확신입니다.

+1

'type f'가 중복되지 않아야합니다. 제 실제 코드에서'type f'는 String 구조체에 적용된 RedBlackTree 펑터의 결과입니다. 이렇게하면 유형이 t 인 결과 StringMap 구조가 생성됩니다. 내 유일한 옵션은 구조체에 StringMap.t으로 설정된'type sm '을 만들거나 서명에 REDBLACKTREERES 구조체를 추가하는 것입니다. 그러나 다시 말하지만, 나는 이들 중 하나가 실제로 서명에 나타나기를 원하지 않습니다. 나는 서명이 아닌 구조체에 첨부 된 유형을 참조하는 이유를 혼란스럽게 생각합니다. 나는 단지 REDBLACKTREERES.t라고 말하고 싶다. – eatonphil

+1

@eatonphil'REDBLACKTREERES.t'의 문제는 펑터가 SML에서 생성된다는 것입니다. 즉, 동일한 펑터를 사용하여 생성 된 두 개의 다른 구조체에서 't'유형은 동일하게 취급되지 않습니다. 그렇기 때문에 유형은 서명이 아닌 구조에서 가져와야합니다. –

+0

@eatonphil 왜 타입 f를 드러내고 싶습니까? 해당 서명을 고객이 어떻게 사용한다고 가정합니까? –