OCaml中用lambda表达式实现高斯求和函数报错求助
解决OCaml中sum_gauss的语法错误问题
需求与现有实现
需要完成两个任务:
- 实现
sum函数,接受整数n和函数f,计算从1到n的f(i)之和(高斯和逻辑) - 基于
sum函数和lambda表达式实现sum_gauss,类型为int->int,用于计算1到n的整数和
已正确实现的sum函数:
let rec sum (n:int) (f:int->int) : int = if n < 1 then 0 else sum (n-1) f + f n
错误代码与问题
编写的sum_gauss代码出现语法错误:
let sum_gauss = sum ((i:int) -> fun (i:int) : int -> i)
错误提示:
Line 1, characters 30-32: Error: Syntax error: ')' expected Line 1, characters 22-23: This '(' might be unmatched
错误分析
- lambda表达式语法错误:OCaml中带类型标注的lambda写法是
fun (参数:类型) -> 表达式,而非(参数:类型) -> 表达式,后者不是合法的lambda定义。 - 参数传递错误:
sum函数需要两个参数(整数n和函数f),但当前代码只传递了一个错误的lambda表达式,没有提供n参数。而sum_gauss应该是一个接收n,并调用sum n f的函数。
正确实现
sum_gauss的核心是调用sum n并传入恒等函数fun x -> x(因为高斯和就是1到n的整数累加),正确写法有两种:
写法一(显式lambda)
let sum_gauss = fun (n:int) -> sum n (fun (x:int) -> x)
写法二(简洁柯里化)
利用OCaml的柯里化特性,直接定义接收n的函数:
let sum_gauss n = sum n (fun x -> x)
两种写法的sum_gauss类型均为int->int,调用sum_gauss 5会返回15,符合预期。
内容的提问来源于stack exchange,提问作者Zeinab Elhad
相关产品推荐
相关产品推荐

