为什么ocaml中函数定义中的替代项会给出不同的结果?

为什么ocaml中函数定义中的替代项会给出不同的结果?,ocaml,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 |

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);; 
工作正常:

fibo12

-:int=233


这些声明是否应该是等价的,我遗漏了什么?

这就是我在第一个定义中出错的地方。应改为:

let rec fibo = function
    0 -> 1
  | 1 -> 1
  | n -> fibo (n - 1) + fibo (n - 2);;
这也很好:

fibo12

:int=233
这就是我在第一个定义中犯的错误。应改为:

let rec fibo = function
    0 -> 1
  | 1 -> 1
  | n -> fibo (n - 1) + fibo (n - 2);;
这也很好:

fibo12

:int=233
我将为未来的读者详细介绍一下你完美的自我回答

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

设rec fibo n=函数 | 0 -> 1 | 1 -> 1 |_u->fibon-1+fibon-2;; 相当于

让我们来讨论一下= 匹配 | 0 -> 1 | 1 -> 1 |_u->fibon-1+fibon-2;; 这不符合签出类型


您可以在中阅读有关函数关键字的更多信息。

我将为未来的读者详细介绍一下您完美的自我回答

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

设rec fibo n=函数 | 0 -> 1 | 1 -> 1 |_u->fibon-1+fibon-2;; 相当于

让我们来讨论一下= 匹配 | 0 -> 1 | 1 -> 1 |_u->fibon-1+fibon-2;; 这不符合签出类型

您可以在中阅读有关函数关键字的更多信息