2013-07-13 25 views
1

下面的代码在REPL键入时的工作原理:SML/NJ代码在REPL但无法编译

type seat = seat_type * int 
val my_seat = (Window, 13) 

fun aow seat = 
    case seat of 
    (Window,_) => "Window" 
     | (Aisle,_) => "Aisle" 

fun is_window (x,_) = x = Window 

aow my_seat 
is_window my_seat 

但如果保存在一个文件和编译,表达aow my_seatis_window my_seat失败,出现以下错误在编译期间:

test1.sml:12.23-16.18 Error: operator is not a function [tycon mismatch] 
    operator: seat_type 
    in expression: 
    Window aow 

uncaught exception Error 
    raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27 
      ../compiler/TopLevel/interact/evalloop.sml:44.55 
      ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20 

如果我把它们注释掉,文件汇编,当我键入REPL两个表达式,他们的工作。什么可能会导致此错误?此外,如果它是相关的,我的数据类型和类型定义的评论是值得欢迎的,因为我没有看到自己适合这个问题。

val x = aow my_seat 
val y = is_window my_seat 

让文件编译:

回答

2

像两个表达式前添加VAL声明。看到这一点,我也试着在aow和is_window函数之前取代乐趣。然而,这导致以下非常合乎逻辑的错误:

Error: syntax error: replacing VAL with FUN 

显然,SML在编译期间不允许使用自由表达式。