首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“Ocaml in”关键字和用法

“Ocaml in”关键字和用法
EN

Stack Overflow用户
提问于 2013-10-27 20:02:02
回答 1查看 8.7K关注 0票数 5

我正在阅读一些注释,并偶然发现了这段代码,这段代码对我来说非常干净:

代码语言:javascript
复制
# 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.

除了有in sum(0, 0.0)的部分外,我什么都懂。问题其实不是关于in关键字,而是这个:sum(0, 0.0)。这意味着什么,为什么这个函数有用?我做了一些谷歌,并从Ocaml网站的in关键字得到了一些东西,但这对我来说毫无意义。这就是我发现的:

代码语言:javascript
复制
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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-27 20:04:08

它是let绑定in主体;您的inlet rec sum相关。

所以内部

代码语言:javascript
复制
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的调试器,或者至少添加一个

代码语言:javascript
复制
 Printf.printf "sum i=%d z=%f\n";

行就在let rec sum(i,z) =行之后。

顺便说一句,你应该用两个参数来编码一个和,而不是用一个单独的参数作为一对:

代码语言:javascript
复制
let rec sum i  z =
if i = m then z else sum(i+1) (z+.f i)
in sum 0 0.0;;

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

代码语言:javascript
复制
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,这是一个累加的部分和。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19622842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档