SMLNJ - 与声明类型Typcon不匹配

问题描述:

我有以下问题:我通过A.阿佩尔在ML编译器的工作,我写了下面的结构简单SMLNJ - 与声明类型Typcon不匹配

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 

使用我编写本ML-法库与

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)); 

,我得到以下错误

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) 

现在我清楚已经将类型亚麻布设置为一个整数。但是当我调用一个需要类型亚型函数(int型)的函数时,我将int作为参数传递(yypos),然后它要求Token.linenum不是int。这不是一个整数,因为我把它设置为这样?或者SML将这些视为不同的类型。如果他们确实将它们视为不同类型,那么除了命名“特殊”类型的int类型之外,类型声明的要点是什么?

在此先感谢。

所以我正在执行的解决方案是在签名中声明类型。换句话说

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

但你仍然需要一点redundency的,你还是要重新声明它在你的结构。希望这可以帮助别人!

的问题是你有签名的归属,即:>部分:

structure Tokens :> Tiger_Tokens = 

这样做有什么有效地隐藏所有类型的Tokens。它被称为不透明签名归属。

还有另一种形式的实际上将暴露所有类型:一透明签名归属:

structure Tokens : Tiger_Tokens = 

的中间地带被称为半透明签名的归属和是这样的:

structure Tokens :> Tiger_Tokens where type linenum = int = 

这只公开linenum类型,而token仍然是抽象的。

+0

非常感谢。 – Freddie