代码之家  ›  专栏  ›  技术社区  ›  Alex Mcp

咖喱只是一种避免继承的方式吗?

  •  9
  • Alex Mcp  · 技术社区  · 16 年前

    如果你有一个很大的毛函数需要10个参数

    function (location, type, gender, jumpShot%, SSN, vegetarian, salary) {
        //weird stuff
    }
    

    您需要一个“子集”函数,它可以让您处理除 jumpShot% ,难道你不应该分解出一个继承自原始函数的类吗?

    我想我要找的是这个模式的一个用例。谢谢!

    4 回复  |  直到 16 年前
        1
  •  1
  •   Mitch Dempsey    16 年前

    在javascript中,我使用回调函数(因为它们在被调用(从调用者)之后不能被传递任何参数)

    ...
    var test = "something specifically set in this function";
    onSuccess: this.returnCallback.curry(test).bind(this),
    
    // This will fail (because this would pass the var and possibly change it should the function be run elsewhere
    onSuccess: this.returnCallback.bind(this,test),
    ...
    
    // this has 2 params, but in the ajax callback, only the 'ajaxResponse' is passed, so I have to use curry
    returnCallback: function(thePassedVar, ajaxResponse){
       // now in here i can have 'thePassedVar', if 
    }
    

    我不确定这是否足够详细或连贯。。。但是currying基本上允许您“预先填充”参数并返回一个已经填充了数据的裸函数调用(而不是要求您在其他点填充该信息)

        2
  •  5
  •   Wolph    16 年前

    咖喱有很多用途。从简单地为经常使用的函数指定默认参数到返回为特定目的服务的专用函数。

    function log_message(log_level, message){}
    log_error = curry(log_message, ERROR)
    log_warning = curry(log_message, WARNING)
    
    log_message(WARNING, 'This would be a warning')
    log_warning('This would also be a warning')
    
        3
  •  1
  •   Steve Jessop    16 年前

    在以函数样式编程时,通常会绑定参数以从旧函数生成新函数(在本例中为谓词)。伪代码:

    filter(bind_second(greater_than, 5), some_list)
    

    可能相当于:

    filter({x : x > 5}, some_list)
    

    哪里 {x : x > 5} 是匿名函数定义。也就是说,它构造了一个包含所有值的列表 some_list 大于5。

        4
  •  0
  •   supercat    15 年前

    在许多情况下,要省略的参数在编译时是未知的,而在运行时是未知的。此外,对于给定函数可能存在的curried委托的数量没有限制。以下是改编自现实世界的程序。

    我有一个系统,在这个系统中,我向远程机器发送命令包,并接收回响应包。每个命令包都有一个索引号,每个回复都带有它作为响应的命令的索引号。翻译成英语的一个典型命令可能是“从地址0x12300开始给我128字节”。一个典型的响应可能是“成功”以及128字节的数据。

    为了处理通信,我有一个例程,它接受许多命令包,每个命令包都有一个委托。当接收到每个响应时,相应的委托将在接收到的数据上运行。与上述命令相关联的委托类似于“确认我获得了128字节数据的‘成功’,如果是这样,将它们存储到地址0x12300的缓冲区中”。注意,多个分组在任何给定时间都可能是未完成的;curried address参数是例程知道传入数据应该去哪里所必需的。即使我想写一个不需要地址参数的“将数据存储到缓冲区”例程,它也无法知道传入的数据应该去哪里。

    推荐文章