gpt4 book ai didi

function - Ocaml "in"关键字及用法

转载 作者:行者123 更新时间:2023-12-02 22:12:31 30 4
gpt4 key购买 nike

我正在阅读一些笔记,发现这段代码对我来说看起来很干净:

# let sigma f m =
let rec sum (i, z) =
if i = m then z else sum(i+1, z+.f i)
in sum(0, 0.0);;
val sigma : (int -> float) -> int -> float = <fun>
# sigma (function k -> float (k*k)) 10;;
- : float = 285.

我理解除了 sum(0, 0.0) 中的部分之外的每一位。好吧,问题实际上并不在于 in 关键字,而是在于:sum(0, 0.0)。这是什么意思?为什么这个函数有用?我做了一些谷歌搜索,并从 Ocaml 网站上找到了有关 in 关键字的信息,但这对我来说毫无意义。这是我发现的:

class-expr  ::= class-path  
∣ [ typexpr {, typexpr} ] class-path
∣ ( class-expr )
∣ ( class-expr : class-type )
∣ class-expr {argument}+
∣ fun {parameter}+ -> class-expr
∣ let [rec] let-binding {and let-binding} in class-expr
∣ object class-body end

我不需要对实际功能的解释。我需要帮助的是那个小小的 in sum(0, 0.0)

最佳答案

它是 let 绑定(bind) in body ;您的 inlet rec sum

所以内部

let rec sum (i, z) =
if i = m then z else sum(i+1, z+.f i)
in sum(0, 0.0);;

是一个用于进行循环的内部尾递归函数,sum(0,0.0) 的结果(具有内部 sum 定义)是 >sigma 函数。

sum(0,0.0) 是尾递归的起点。

我建议你使用Ocaml的调试器,或者至少添加一个

 Printf.printf "sum i=%d z=%f\n";

紧接在 let rec sum(i,z) = 行之后的行。

顺便说一句,您应该用两个参数来编写总和,而不是用一个恰好是一对的参数来编写代码:

let rec sum i  z =
if i = m then z else sum(i+1) (z+.f i)
in sum 0 0.0;;

顺便说一句,我会用减少的 i 和代码来循环

let sigma f m = 
let rec sumloop i s =
(* Printf.printf "sumloop i=%d s=%f\n" i s ; *)
if (i <= 0) then s
else sumloop (i-1) (s+.f i)
in sumloop m 0.0 ;;

我同意我的 sigma 函数略有不同(特别是当参数 f 是具有副作用的不纯函数时)。我将内部尾递归函数命名为 sumloop(不仅仅是 sum),以强调它是一个循环。

您的 z 形式到 sum 和我的 s 形式到 sumloop 是累积部分和。

关于function - Ocaml "in"关键字及用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19622842/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com