2016-04-21 85 views
0

我有問題理解SML的語法嵌套let s和if s。例如,爲什麼這種語法形式不正確?嵌套讓和如果語句

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分枝有型boola = b是一個比較,而不是分配的,但如果它是一個任務,它就會有類型unit,這也是錯誤的類型),並且您的else-分支的類型爲int。您可以通過在else分支這樣返回一個布爾使你的代碼編譯:

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 S IN SML,所以如果你想分配給a在你的代碼,你需要使它成爲int ref而不是簡單的int