Как разделены объявления в программе SML? - PullRequest
0 голосов
/ 02 мая 2020

In SML грамматика

Программы

prog ::=   dec core declaration
           functor fctbind functor declaration
           signature sigbind signature declaration
           empty
           prog1 ⟨;⟩ prog2 sequence

fctbind ::= id1 ( id2 : sig ) ⟨:⟨>⟩ sig⟩ = str ⟨and fctbind⟩    plain
id ( spec ) ⟨:⟨>⟩ sig⟩ = str ⟨and fctbind⟩ opened
sigbind    ::= id = sig ⟨and sigbind⟩ signature

Почему

val a = 1
val b = 2;

a
b

имеет ошибку между a и b, но не между двумя декларациями val?

$sml < main.sml
Standard ML of New Jersey v110.78 [built: Thu Aug 31 03:45:42 2017]
- val a = 1 : int
val b = 2 : int
= stdIn:4.1-5.2 Error: operator is not a function [tycon mismatch]
  operator: int
  in expression:
    a b

Спасибо.

1 Ответ

1 голос
/ 02 мая 2020

In

val a = 1
val b = 2

Все, что вы сделали, это связали две переменные, соответствующие правилам dec ::= val ⟨var⟩(,) valbind, dec ::= dec1 ⟨;⟩ dec2, и на верхнем уровне, prog ::= dec.

Затем в

a
b

Вы на самом деле пытаетесь применить a к b (exp ::= exp1 exp2 (application)). Возможно, было бы проще увидеть его как эквивалентно написанное

a b

Однако a не имеет типа функции, следовательно, ошибка operator is not a function. Неясно, что вы на самом деле пытаетесь сделать с a и b.

...