2016-04-22 3 views
0

Синтаксис на этом языке запутан.заявление о печати, вызывающее ошибку?

fun bar a = 
    print (Int.toString a); 
    0 

компилируется. Не знаю, почему emacs откладывает 0.

fun bar a = 
    print (Int.toString a) 
    0 

Выдает сообщение об ошибке.

Error: operator is not a function [tycon mismatch] 
    operator: unit 
    in expression: 
    (print (Int.toString a)) 0 


fun foo a = 
    if a < 0 
    then 
     0 
    else 
     0 

компилируется.

fun foo a = 
    if a < 0 
    then 
     print (Int.toString a); 
     0 
    else 
     0 

выдает сообщение об ошибке.

syntax error: replacing SEMICOLON with EQUALOP 

Wat?

Я не могу понять это.

ответ

3

Кажется, вам трудно понять, где точки с запятой могут использоваться в SML. Есть два основных места, где они разрешены:

  1. Внутри группы в круглых скобках: (a; b). Это означает, что a; b недействителен. Вам нужно обернуть его в круглые скобки.

  2. Между in и end в блоке let. Тем не менее, вы не круглые скобки здесь:

let 
    val foo = ... 
in 
    a; 
    b; 
    c 
end 

Итак, ваш последний пример должен быть:

fun foo a = 
    if a < 0 
    then (print (Int.toString a); 0) 
    else 0 

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

+0

Часть путаницы может быть прослежена так, как некоторые стандартные книги, такие как Ульман, склонны злоупотреблять точкой с запятой. Легко получить впечатление, что точки с запятой являются в первую очередь терминаторами, а не разделителями. –

+0

Есть ли способ использовать оператор печати в качестве последнего оператора в ветке if/else, а не return() из этой ветви? Этот язык выглядит как корсет ... –

+0

@lotolmencre 'if true then print (" foo ") else()'. Операция 'print' уже является функцией единицы. Вы всегда можете обернуть это другой функцией 'fun printIfTrue (test, val) = if test then print (val) else()'. – eatonphil

Смежные вопросы