我正在学习Jason Hickey's Introduction to Objective Caml。在学完第三章后,我似乎理解了
这是我的最终解决方案:
let
和fun
的工作原理,但是我仍然有困难编写自己的fun
。
以下是我面临的一个例子问题。
编写一个函数sum,给定两个整数边界n和m以及一个函数f,计算一个求和(不允许使用for循环)。即,sum n m f = f(n) + f(n+1) + ... + f(m)
那么,我应该如何开始考虑编写这个函数sum呢?
在Java或其他普通的编程语言中很容易实现。
由于不允许使用for循环,所以我猜我应该用let rec
的方式来实现?
像这样:
let rec sum n m f = fun i -> ....
我需要一个作为游标吗?
无论如何,我已经想不出下一步怎么做了。
有人能给我指条路,帮我编写OCaml函数吗?
这是我的最终解决方案:
let rec sum n m f = if n <= m then (f n)+(sum n+1 m f) else 0;;
但是,当然,它是错误的。错误是 Error: This expression has type 'a -> ('a -> int) -> 'b
but an expression was expected of type int
为什么?'a 是什么?
let rec sum1 n m f = sum2 n m 0 and sum2 n m s = if n <= m then sum2 (n+1) m (s+f n) else s;;
这个函数是尾递归吗? - Jackson Tale