2017-08-06 10 views
0

1)モジュールOCAML最初のクラスモジュール署名推論

module Int_Sig_1 = 
struct 
let x = 1 
end 
;; 

2があると)、このモジュールの明示的な署名

module type INT_SIG = 
sig 
val x:int 
end 
;; 

3)iは基づいて、第1のクラスのモジュールを作成します上記のモジュールとモジュールのタイプについて

let int_sig_1 = (module Int_Sig_1:INT_SIG) 

4)ここでは、明示的な署名ではなく、同じ推論された署名UREは、本実世界OCAMLの第10章に書かれたよう

module Int_Sig_2 = 
struct 
let x =2 
end 
;; 

上記

5)として、「モジュールタイプは、それが推測できる場合は、ファーストクラスのモジュールの構成の一部である必要はありません」、私はその後、私は上記と同じことをしよう)私は

Error: The signature for this packaged module couldn't be inferred.

6次のエラーを取得する

let a2 = (module Int_Sig_2);; 

上記のモジュールを使用して第1、第2クラスモジュールを作成しようとするが、明示的なモジュールタイプと5、しかしth ファーストクラスのモジュールで、モジュールタイプがのものがリストの要素として作成されます。リストの先頭は上記の3の明示的な署名から作成されたファーストクラスのモジュールです。図5は、上記の私にエラーを与え、6が故障していない理由を

let int_sig= [int_sig_1;(module Int_Sig_2)];; 
val int_sig : (module INT_SIG) list = [<module>; <module>] ;; 

私の質問はありますか?

答えて

2

(5)の問題は、一般に、推論できる複数のモジュールタイプがあることです。言い換えれば

module type empty = sig end 
module type with_x = sig val x:int end 

、両方

let a2 = (module Int_Sig_2: empty) 
let a2_bis = (module Int_Sig_2:with_x) 

が有効である:あなたの例では、Int_Sig_2をパックするために使用することができ、少なくとも2つの有効なモジュールタイプがあります。その結果、型チェッカーはこの状況でモジュール型を推測しようとしません。

逆に、あなたの例(6)では、リストの型は、最初の要素の型が(module INT_SIG_2)であることによって決定されます。したがって、型チェッカーはこの情報を使用して、リストは(module INT_SIG_2)です。それにもかかわらず、2つの要素を逆にすると、型エラーが発生します。換言すれば、これは問題である。

[(module struct let x = 2 end: with_x); (module struct let x = 1 end)] 
しかしながら

、逆収率

[(module struct let x=2 end); (module struct let x = 3 end:with_x)];; 
Error: The signature for this packaged module couldn't be inferred. 

これは型チェッカーは、左から右へのバイアス及びタイプ第有するという事実によるものです最初のリストの最初の要素。

+0

私はあなたにフォローアップの質問をしてもらえますか? –

+0

もちろん、尋ねることはありません。 – octachron

+0

特権いただきありがとうございます。 は= SIG 型T モジュール型MOD_SIG)iは 1を有する ヴァル分とします) モジュールMOD_UINT8を ヴァル最大 2分T –