2017-06-21 73 views
0

對不起,我不知道如何給一個適當的標題爲這個問題: 如果我做的:ocaml的 - 重新定義一個新的函數內部功能

let f1= function 1 -> failwith "a" | s ->s;;(*you can just use f1 x=x, just want to let f1 to have an exception case*) 
let f2 = 
    let f1= 
      try(print_string "s1";f1) 
      with _ -> (print_string "s2" ;failwith "s3") 
    in 
    let conv tm = f1 tm 
    in conv;; 
let f3 = 
    let conv tm = 
     let f1= 
      try(print_string "s1";f1) 
      with _ -> (print_string "s2" ;failwith "s3") 
     in 
     f1 tm 
    in conv;; 
  1. 我們可以看到,「S1」是已經在定義f2時打印(加載此功能之後),這意味着在加載f2時已經執行了新的f1
  2. 如果我們嘗試f2 1和f3 1,只有f3 1將打印「s1」。
  3. 無論F2 F3也沒有打印「S2」,當出現異常時

現在我有點困惑是怎麼回事。 F1居然被重新定義,甚至在F2,因爲如果我們這樣做

let f4 = 
    let f1=() 
    in 
    let conv tm = f1 tm 
    in conv;; 

將發生類型檢查錯誤。

  1. 我不知道f2和f3之間的區別,因爲f1在conv之前就被重新定義了。
  2. 爲什麼在f3中,即使打印出「s1」,「s2」也不會像我預期的那樣打印出來?

我使用的OCaml 4.01.0

+0

我想提F2和F3之間的區別:在F2,F1是一個數值,它被定義後立即評估,因此「S1」是加載f2後打印。在f3中,conv是一個函數,因此不會立即評估conv,所以不是f1。因此,「s1」不是打印在f3 –

回答

1

f1實際上是所謂的異常僅拋出。但是,您不要在try區塊內調用它 - 在f2f3 - 您只需評估那裏的參考,並將返回值分配給您當地的f1變量。導致異常的實際呼叫始終爲f1 tm

你似乎在尋找

let f4 tm = try 
       print_string "s1"; 
       f1 tm 
      with 
       _ -> print_string "s2"; 
        failwith "s3";; 
+0

乾杯,這是我在stackoverflow的第一個問題,這是我收到的第一個答案!對不起,我不能投票,因爲我沒有足夠的聲望。我不確定我是否應該立即接受這個答案或等待一段時間。我也希望f2和f3之間的比較(f2在加載時立即輸出「s1」)我想我已經知道了,所以無論如何我都會接受這個答案。 (希望我能接受更多的答案,以防其他好的問題。 –