【问题标题】:why alternatives in function definition in ocaml gives different results?为什么 ocaml 中函数定义的替代方案会给出不同的结果?
【发布时间】:2019-07-21 19:37:19
【问题描述】:

Windows 10 上的 ocaml 4.01.0+ocp1

刚接触 ocaml,我在 toploop 中遇到了一个有趣的行为:

 let rec fibo n = function
    0 -> 1
  | 1 -> 1
  | _ -> fibo (n - 1) + fibo (n - 2);;

抛出:

错误:此表达式的类型为 int -> int 但是需要一个 int 类型的表达式

同时,

 let rec fibo n = 
  match n with
    0 -> 1
  | 1 -> 1
  | _ -> fibo (n - 1) + fibo (n - 2);; 

工作正常:

斐波那契 12;;

- : int = 233

这些声明不应该是等价的吗,我错过了什么?

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    这是我在第一个定义中弄错的地方。它应该是:

    let rec fibo = function
        0 -> 1
      | 1 -> 1
      | n -> fibo (n - 1) + fibo (n - 2);;
    

    这也很好用:

    斐波那契 12;;

    • :int = 233

    【讨论】:

      【解决方案2】:

      我会为未来的读者详细说明您(非常好)的自我回答。

      在 OCaml 中,function 关键字将匿名参数添加到用于模式匹配的函数中。换句话说,你的第一次尝试

      let rec fibo n = function
        | 0 -> 1
        | 1 -> 1
        | _ -> fibo (n - 1) + fibo (n - 2);;
      

      等价于

      let rec fibo n m =
        match m with
        | 0 -> 1
        | 1 -> 1
        | _ -> fibo (n - 1) + fibo (n - 2);;
      

      不按类型检查。

      您可以在Real World OCaml 中阅读有关function 关键字的更多信息。

      【讨论】:

        猜你喜欢
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 2014-02-01
        • 2021-08-26
        • 1970-01-01
        • 2015-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多