對不起,我不知道如何給一個適當的標題爲這個問題: 如果我做的: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;;
- 我們可以看到,「S1」是已經在定義f2時打印(加載此功能之後),這意味着在加載f2時已經執行了新的f1
- 如果我們嘗試f2 1和f3 1,只有f3 1將打印「s1」。
- 無論F2 F3也沒有打印「S2」,當出現異常時
現在我有點困惑是怎麼回事。 F1居然被重新定義,甚至在F2,因爲如果我們這樣做
let f4 =
let f1=()
in
let conv tm = f1 tm
in conv;;
將發生類型檢查錯誤。
- 我不知道f2和f3之間的區別,因爲f1在conv之前就被重新定義了。
- 爲什麼在f3中,即使打印出「s1」,「s2」也不會像我預期的那樣打印出來?
我使用的OCaml 4.01.0
我想提F2和F3之間的區別:在F2,F1是一個數值,它被定義後立即評估,因此「S1」是加載f2後打印。在f3中,conv是一個函數,因此不會立即評估conv,所以不是f1。因此,「s1」不是打印在f3 –