2016-04-21 11 views
0

ネストされたletifのSMLの構文を理解する際に問題が発生しています。たとえば、なぜこれは構文的に不適切なのでしょうか?ネストされた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が1でない場合は、最初の場所でrを作成し、0ちょっと愚かを返しますが、O ...よく

していない、raを等しくしますだから、なぜこれは構文的に間違っているのですか?

答えて

4

構文上の誤りはありません。しかし、これは型エラーです。

問題は、あなたのthen -branchはタイプboola = bは比較ではなく、代入され、それが割り当てた場合、それはあるだろう持っているのに対し、ifの両方のブランチは、同じ型を持っている必要があるということですunitもタイプが間違っています)、elseブランチのタイプは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:あなたのコードでaに割り当てるたかったので、もしあなたが唯一、SMLにref Sに割り当てることができることに注意してください、普通のintではなく、int refにする必要があります。

関連する問題