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
这些声明不应该等效吗?我想念什么?
答案 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
关键字。