【问题标题】:Simple OCaml exercise简单的 OCaml 练习
【发布时间】:2011-10-15 01:06:07
【问题描述】:

我正在尝试通过 Jason Hickey 的笔记自学 OCaml,而下面的练习让我很困惑。 问题:编写一个函数 sum,给定两个整数边界 m,n,一个函数 f 计算总和。 我正在尝试这个:

     let rec sum m n f=
     if m>n then 0
     else if m=n then f n
     else f m + sum n m+1 f

但它不起作用,产生类型错误。

【问题讨论】:

  • 类型错误 _ sum n m_ `错误:此表达式的类型为 ('a -> int) -> 'b 但表达式应为 int 类型'。我已经得到了答案,但我想如果我更仔细地阅读这篇文章,我就有机会自己弄清楚了。

标签: ocaml


【解决方案1】:

你需要一些括号。

let rec sum m n f=
     if m>n then 0
     else if m=n then f n
     else f m + sum n (m+1) f

(虽然为了可读性,我通常会在最后一行加上括号,否则(f m) + (sum n (m+1) f)。) 没有括号的情况是它将其视为(f m) + (sum n m) + (1 f),这会产生sum n m 没有类型int 的错误,因为它是具有更复杂类型的部分函数应用程序。

作为一般规则,当表达式作为参数传递给函数时,总是需要用括号括起来。在相关说明中,如果您真的想将 plus 函数作为参数传递,您可以将其放在括号中(例如:sum m n (+)(尽管在这种情况下不会键入 check,因为 + 需要两个数字) )。

【讨论】:

    【解决方案2】:

    函数应用(函数名与其参数的绑定)在 OCaml 中具有最高优先级。所以,你需要注意你的括号。我没有给出解决方案,因为自己解决可能会更有趣。

    【讨论】:

    • 谢谢。这两个答案都很有启发性。我接受了第一个答案,只是因为它是第一位的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多