【问题标题】:How to write a simple higher order function in mozart oz?如何在 mozart oz 中编写一个简单的高阶函数?
【发布时间】:2012-12-28 07:48:49
【问题描述】:

我是 mozart oz 的初学者,我想写一个简单的高阶函数,例如 {{Add 1}2},其结果必须为 3。我想这类似于嵌套调用C,函数可以在哪里调用自己?我不知道如何定义这个函数,我应该写吗

declare
fun {Add I}

declare
fun {{Add I}J}

? 而且我真的不知道如何完成这样的功能。试了好几次都没成功。

【问题讨论】:

    标签: oz mozart


    【解决方案1】:

    这样的东西应该可以工作(未经测试):

    declare
       fun {Add I}
          % define a local function which adds I to its argument
          fun {Adder J}
             J + I
          end
       in
          % returns this new function
          Adder
       end
    
    {Show {{Add 1} 2}}  % should print 3
    
    % or more verbose:
    declare
       Add1 = {Add 1}
       {Show {Add1 2}}
    

    【讨论】:

    • 我得到“变量加法器没有被引入。”
    • @Tadgh:确实有一个错误。我添加了“in”关键字来将本地加法器的声明与函数体分开。
    • 谢谢。为什么这行得通? Function只在本地声明,然后整个函数的返回值为“Adder”?
    • @Tadgh:是的,Add 的返回值是函数Adder(即函数是值)。 Adder 仅在本地声明不是问题。该函数(及其背后的代码)只是一个值,就像任何其他值一样,只有在没有变量引用它时才会被销毁/垃圾收集。 - 事实上,Adder必须在本地定义,因为它“关闭”了参数I。每当调用 Add 时,都会创建一个新函数 Adder
    【解决方案2】:

    简洁的代码:

    fun{Add I}
       fun{$ J} I+J end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多