【发布时间】:2012-12-04 15:05:06
【问题描述】:
我正在学习Jason Hickey's Introduction to Objective Caml。
在学习了第 3 章之后,我似乎了解了 let 和 fun 的工作原理。但是,我仍然无法编写自己的fun。
这是一个示例问题我面临的问题。
Write a function sum that, given two integer bounds n and m and a function
f, computes a summation (no for loop allowed). i.e., sum n m f = f(n) + f(n+1) + ... + f(m)
那么,我应该如何开始考虑产生这个函数 sum?
在 Java 或普通编程语言中,这很容易。
由于这里不允许使用 for 循环,所以我想我应该以let rec 的方式进行操作?
类似这样的:
let rec sum n m f = fun i -> ....
我需要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?
【问题讨论】:
-
仅供参考,如果你在 OCaml 中编程,你不应该再考虑循环:即使循环是
let rec表达式的语法糖。 -
@KristopherMicinski 所以 OCaml 总是更喜欢 rec 吗?
-
是的,这是执行任何类型递归的函数式方法。在 OCaml 的情况下,最好使用尾递归函数,它不会建立堆栈帧。永远不要再使用循环(除非你真的明白它们是语法糖,并且你有充分的理由更喜欢它们而不是递归)。
-
@KristopherMicinski 我的解决方案不是尾递归的,对吧?
标签: functional-programming ocaml