为什么ocaml中的函数定义替代方法会产生不同的结果?

时间:2019-02-27 23:56:31

标签: ocaml

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);; 

工作正常:

  

fibo 12 ;;

     

-:int = 233

这些声明不应该等效吗?我想念什么?

2 个答案:

答案 0 :(得分:2)

这是我在第一个定义中弄错的。它应显示为:

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

也可以正常工作:

  

fibo 12 ;;

     
      
  • :int = 233
  •   

答案 1 :(得分: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关键字。