2017-08-19 2 views
1

とTypconの不一致、私は次の問題を持っている:私はMLでA.アペルのコンパイラによって働いていると私はML-LEXライブラリを使用して、以下のような単純な構造SMLNJ - 宣言された型

signature Tiger_Tokens = 
sig 
    type linenum; 
    type token; 
    val ADD : linenum*linenum -> token; 
    val INT : string*linenum*linenum -> token; 
    val EOF : linenum*linenum -> token; 
end 

structure Tokens :> Tiger_Tokens = 
    struct 
     type linenum = int; 
     type token = string 

     fun ADD(i,j) = "ADD" 
     fun INT(number, i, j) = "INT" 
     fun EOF(i,j) = "EOF" 
    end 

を書かれている私はこれをコンパイルしています

type lexresult = Tokens.token 
val lineNum = ref 1; 
fun eof() = Tokens.EOF(!lineNum, !lineNum) 

%% 
digits=[0-9]; 
%% 
\n => (!lineNum = (!lineNum) + 1; lex()); 
"+" => (Tokens.ADD(yypos,yypos+1)); 
{digits}+ => (Tokens.INT(yytext, yypos,yypos+1)); 

と、私は今、はっきりとI次のエラー

tiger.lex.sml:172.8-172.33 Error: operator and operand don't agree [tycon mismatch] 
    operator domain: Tokens.linenum * Tokens.linenum 
    operand:   int * int 
    in expression: 
    Tokens.ADD (yypos,yypos + 1) 

を取得型linenumをintに設定しています。しかし、型リネーム(int型)を期待する関数を呼び出すと、int型を引数(yypos)として渡すと、int型ではなくToken.linenumが要求されます。私はそのように設定して以来、これはintではありませんか?あるいは、SMLはこれを異なるタイプと見なします。彼らがそれらを異なる型として見ているなら、型宣言のポイントは何ですか?

ありがとうございます。

答えて

0

私が実装している解決策は、署名の型を宣言することです。言い換えれば、

しかし、まだ少しの冗長性が必要ですが、あなたの構造内でそれを再宣言する必要があります。これが誰かを助けることを願って!効果的Tokensにすべてのタイプを非表示にし、これは何

structure Tokens :> Tiger_Tokens = 

です:

2

問題は、あなたが持っている署名帰属、すなわち、中:>一部でした。これは、と呼ばれ、不透明な署名帰属と呼ばれます。

実際にすべてのタイプを公開します別のフォームがあります:透明署名帰属:

structure Tokens : Tiger_Tokens = 

ミドルアースは半透明署名帰属と呼ばれ、次のようになります。

structure Tokens :> Tiger_Tokens where type linenum = int = 

これはlinenumタイプのみを公開し、tokenは抽象的なままです。

+0

ありがとうございました。 – Freddie

関連する問題