Ocaml - 重新定义新函数内的函数

时间:2017-06-21 00:38:46

标签: 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. 我们可以注意到在定义f2时已经打印了“s1”(加载此函数后),这意味着在加载f2时已经执行了新的f1
  2. 如果我们尝试f2 1和f3 1,只有f3 1会打印“s1”。
  3. 发生异常时,f2和f3都不打印“s2”
  4. 现在我对正在发生的事情感到有些困惑。 f1实际上是重新定义的,即使在f2中也是如此,因为如果我们这样做了

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

    将发生类型检查错误。

    1. 我不知道f2和f3之间的区别,因为无论如何f1在conv之前被重新定义。
    2. 为什么在f3中,即使打印“s1”,“s2”也不会像我预期的那样打印出来?
    3. 我正在使用ocaml 4.01.0

1 个答案:

答案 0 :(得分:1)

仅在实际调用f1时抛出异常。但是,您不会在try块中调用它 - 在f2f3中 - 您只需评估其中的引用并将返回值分配给您的本地f1变量。导致异常的实际调用始终为f1 tm

你似乎在寻找

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