以下代码在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_seat
和is_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中输入两个表达式时,它们都能正常工作。什么可能导致此错误?而且,如果它是相关的,那么关于我的数据类型和类型定义的评论是非常受欢迎的,因为我不认为自己适合这个主题。
答案 0 :(得分:2)
在两个表达式之前添加val语句,如:
val x = aow my_seat
val y = is_window my_seat
让文件编译。看到这一点,我也尝试在aow和is_window函数之前替换fun。但是,这会导致以下非常合乎逻辑的错误:
Error: syntax error: replacing VAL with FUN
显然,SML在编译期间不允许自由表达。