Код SML / NJ работает в REPL, но не компилируется

Приведенный ниже код работает при вводе в 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, они работают. Что может вызвать эту ошибку? А также, если это уместно, комментарии о моем типе данных и определениях типов более чем приветствуются, поскольку я не считаю себя подходящим для этого.


person barerd    schedule 13.07.2013    source источник


Ответы (1)


Добавление оператора val перед обоими выражениями, например:

val x = aow my_seat
val y = is_window my_seat

позволяет файлу компилироваться. Видя это, я также попытался заменить функции fun before aow и is_window. Однако это приводит к следующей очень логичной ошибке:

Error: syntax error: replacing  VAL with  FUN

Очевидно, SML не позволяет использовать свободные выражения во время компиляции.

person barerd    schedule 14.07.2013