`
AvinDev
  • 浏览: 113337 次
社区版块
存档分类
最新评论

高阶函数中变量的绑定和匹配问题

阅读更多
一直一来没有留意到这个问题,今天偶尔在blog上看到,就标记一下,别让自己忘记了。

文章在 http://easyerl.blogspot.com/2007/10/high-order-functions-must-be-tested.html

测试代码如下:
1> Filter = fun(Elem) -> fun({Elem, _, _}) -> true; (_) -> false end end. 
#Fun<erl_eval.6.49591080>
2> C = Filter(cpu).
#Fun<erl_eval.6.49591080>
3> C({test, t, t}).
true % this should have been false ...


按理来说,C应该等同与一个这样的函数:
fun({cpu, _, _}) -> true; (_) -> false end.

这样
C({test, t, t}) 应该返回 false

作者指出,参考 http://www.erlang.org/doc/programming_examples/funs.html#2.4,有一段如下文字:
引用
The rules for importing variables into a fun has the consequence that certain pattern matching operations have to be moved into guard expressions and cannot be written in the head of the fun.


因此应该用
f(...) ->
    Y = ...
    map(fun(X) when X == Y ->
             ;
           (_) ->
             ...
        end, ...)
    ...

取代
f(...) ->
    Y = ...
    map(fun(Y) ->
             ;
           (_) ->
             ...
        end, ...)
    ...


因此正确做法是
Filter = fun(Elem) ->
 fun({X, _, _}) when X == Elem -> true; (_) false end
 end.
分享到:
评论

相关推荐

    hof692.github.io:高阶函数

    这种特性常用于创建私有变量和实现高阶函数。例如,一个工厂函数可以返回一个新的函数,该函数保留了对外部环境的引用,形成了闭包。 高阶函数在实际开发中有着广泛的应用,不仅限于JavaScript。例如,在Python中,...

    Higher-order functions for c++.zip

    在C++编程语言中,"Higher-order functions"(高阶函数)是一个重要的概念,它源自函数式编程领域。高阶函数是指可以接受一个或多个函数作为参数,或者返回一个新的函数作为结果的函数。这种特性使得C++代码更加灵活...

    js函数扩展

    例如,`map()`、`filter()`和`reduce()`等数组方法就是高阶函数,它们接受一个回调函数作为参数,对数组中的每个元素进行操作。 3. **闭包**:闭包是JavaScript中的一个重要特性,它允许函数访问并操作其词法作用域...

    Lisp函数参考大全中文版_lisp大全pdf_Lisp函数参考大全中文版_

    4. **高阶函数**:Lisp包含许多高阶函数,如`mapcar`对列表中的每个元素应用函数并返回新列表,`reduce`将列表中的元素聚合为单一值,`funcall`允许动态调用函数。 5. **宏**:Lisp的宏系统允许程序员定义自己的...

    python语言中的函数 高清.pdf版下载

    闭包函数在设计模式、高阶函数等场景下非常有用。 装饰器是Python中一个非常强大的特性,其基本思想是不直接修改函数的源代码和调用方式,而是通过另外定义一个函数(装饰器函数)来接收原函数作为参数,然后返回一...

    函数参数与返回值PPT课件.pptx

    在函数重载中避免不必要的混淆,保持接口清晰• 使用函数指针和高阶函数实现模块化和可扩展性• 注意函数返回值的处理,特别是在异步编程中确保正确处理返回结果第 22 页 / 共 33 页学习建议• 理解并掌握各种参数...

    用C++进行函数式编程

    这为在C++中实现更高层次的函数式编程概念(如高阶函数)提供了基础。 #### 示例:使用纯函数改进代码 考虑一个简单的例子,假设有一个函数需要根据输入的数字列表计算平均值。传统的方法可能会直接在函数内部修改...

    JavaScript中函数对象调用模式总结

    函数对象可以在变量中赋值、作为参数传递,甚至作为其他函数的返回值,这在实现高阶函数和回调函数时非常常见。 函数调用模式主要有以下几种: 1. **基础调用模式**:这是最简单的形式,如 `func()`. 这种调用方式...

    函数式Swift 已对应 Swift 4

    例如,`map`、`filter`和`reduce`都是Swift标准库中的高阶函数,它们分别用于对集合进行映射、过滤和归约操作。在Swift 4中,这些函数的使用更加流畅,提高了代码的效率和可读性。 其次,Swift的闭包(Closure)也...

    javascript 函数教程(由浅入深)

    10. **高阶函数**: - 函数可以作为参数传递给其他函数,也可以作为其他函数的返回值。 了解并熟练掌握JavaScript函数的使用,是成为一名合格的前端开发人员的基础。通过实例练习,可以更好地理解和应用这些概念,...

    陶大lesson8whyfpmatters.pdf

    标题《陶大lesson8why fpmatters.pdf》和描述《陶大-lesson8 why fp matters》暗示这是一...通过实例代码,文档强调了函数式编程的几个关键特性,如不可变性、高阶函数和递归,并展示了如何在实际编程中应用这些概念。

    SML NJ Error Message_函数式_ML_

    2. 学习SML语言基础:深入理解SML的类型系统、模式匹配、高阶函数等核心概念,有助于避免和解决错误。 3. 加入社区:参与SML相关的论坛或社区,与其他开发者交流,共同解决问题。 4. 练习编程:通过实践编写SML程序...

    JS函数总结

    这一特性使得函数在JavaScript中被广泛地作为高阶函数使用。 函数由名称、参数列表和函数体组成。参数列表中的每个参数都是一个变量,这些变量将在函数调用时被传递给函数的值所替代。函数体包含了执行实际任务的...

    javascript常用函数集合

    14. **函数式编程**:高阶函数(如`map()`, `filter()`, `reduce()`)和函数组合是JavaScript中实现函数式编程的关键。 15. **错误处理**:`try...catch`结构用于捕获和处理运行时错误,`throw`语句用于抛出自定义...

    RunTime_实现函数

    在更复杂的情况下,可以使用闭包或高阶函数来创建具有特定行为的函数。 5. 动态类型与动态绑定:在动态类型语言中(如Python、Ruby),类型检查是在运行时进行的,这使得我们可以灵活地改变对象的类型和行为。例如...

    javascript函数详解!

    高阶函数是接受其他函数作为参数,或者返回一个函数的函数。它们在函数式编程中非常常见,例如`Array.prototype.map()`和`Array.prototype.filter()`。 11. **函数绑定** `Function.prototype.bind`方法可以创建...

    C语言的那些小秘密之函数指针

    在C语言中,函数指针可以被用作函数的参数,这样就可以实现函数间的相互调用,甚至可以创建可以接受其他函数作为输入的高阶函数。例如: ```c void call_func(int (*func_ptr)(int, int), int x, int y) { int ...

    PHP闭包函数传参及使用外部变量的方法

    闭包在很多编程语言中都有涉及,而在PHP中,它尤其有助于创建高阶函数,即把函数作为参数传递给其他函数,或从其他函数返回函数。 在PHP中使用闭包函数,有时会遇到需要使用定义在闭包外部的变量。在Laravel框架中...

    delphi函数参考大全第11章

    `Array.Map`、`Array.Filter`就是常见的高阶函数例子,它们对数组进行操作。 10. **函数指针与回调函数**: - 函数指针可以存储函数的地址,允许在运行时动态调用函数。这在需要动态绑定行为或创建回调机制时非常...

    JAVA SCRIPT 函数 完整 版

    8. **高阶函数**:接受函数作为参数或者返回函数的函数,例如`map`、`filter`和`reduce`。 9. **函数表达式**:函数也可以通过表达式来定义,如立即执行函数表达式(IIFE): ```javascript (function() { ...

Global site tag (gtag.js) - Google Analytics