2016-04-21 2 views
0

У меня возникли проблемы с синтаксисом SML для вложенных let s и if s. Например, почему это синтаксически плохо сформировано?Вложенные операторы let и if

fun stuff a = 
    let 
     val p = 2 
    in 
     if a = 1 
     then 
     let 
      val r = p 
     in 
      a = r 
     end 
     else 
     0 
    end 

если a является 1, то сделать a равным r, если a не 1, то не создавать r в первую очередь и возвращать 0. Любопытное глупо, но о хорошо ...

Итак, почему это синтаксически неверно?

ответ

4

Это не синтаксически неверно. Это, однако, ошибка типа.

Проблема состоит в том, что обе ветви в if должны иметь тот же тип, в то время как ваш then ветвп имеет тип bool (a = b сравнение, а не назначение, но если бы это было задание, он должен был бы тип unit, который также является неправильным типом), и ваш else -branch имеет тип int. Вы можете сделать свой код компиляции, возвращая логическое значение в другое отделение, как это:

fun stuff a = 
    let 
    val p = 2 
    in 
    if a = 1 
    then 
     let 
     val r = p 
     in 
     a = r 
     end 
    else 
     false 
    end 

PS: Обратите внимание, что вы можете назначить только ref с в SML, так что если вы хотите назначить a в своем коде, вам нужно сделать это int ref, а не простой int.

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

  • Нет связанных вопросов^_^