と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はこれを異なるタイプと見なします。彼らがそれらを異なる型として見ているなら、型宣言のポイントは何ですか?
ありがとうございます。
ありがとうございました。 – Freddie