`
诺铁
  • 浏览: 35381 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

高阶函数的威力

阅读更多

 

高阶函数的威力

 

All about monads里看到的解释mondad的例子,令人感动的优雅代码,我用纯foldl改写,去除了其中monad的内容,这样初学haskell的人应该也看得懂。

我们先定义类型羊(Sheep)和两个函数,求羊的父亲和母亲

type Sheep = String

father :: Sheep -> Sheep
father s = "f_" ++ s

mother :: Sheep -> Sheep
mother m = "m_" ++ m

如果要查找羊的奶奶或者爷爷怎么办呢?很简单

grandma :: Sheep -> Sheep
grandma s = mother (mother s)

grandpa :: Sheep -> Sheep
grandpa s = father (father s)

当然,依次类推,你可以写上几页代码把羊的十八代祖宗都写出来,但我相信正常的程序员不会愿意那么干的。

那么我们就来看看利用高阶函数能写出怎样优雅的实现。

--  我们传递一个函数(Sheep->Sheep)的集合来作为第二个参数,然后利用foldl来计算它。
findAncestor :: Sheep -> [(Sheep -> Sheep)] -> Sheep
findAncestor s l = foldl getParent s l  -- 将函数作为参数传递
        where getParent s f = f s

用法

findAncestor "dolly" [mother,father,father]   -- dolly's mother's father's father
findAncestor "dolly" [father,mother,father,mother]   -- dolly's father's

 

分享到:
评论

相关推荐

    JS函数式编程指南

    - **示例**: 使用纯函数和高阶函数(如`map`, `filter`, `reduce`)来实现简单的数据处理逻辑。 - **目的**: 展示函数式编程如何简化常见的编程任务。 ##### 1.3 快速概览 - **概述**: 对函数式编程的关键概念进行...

    haskell_examples.rar_Haskell

    3. **高阶函数**:Haskell中广泛使用高阶函数,如`map`, `filter`, 和 `foldl/foldr`。`funpro.hs`可能包含这些函数的实现或应用,展示了它们在解决复杂问题中的威力。 4. **模式匹配**:Haskell允许我们在函数定义...

    深入学习 Java 中的 Lambda

    - 可读性:通过使用Lambda,代码的意图更加清晰,尤其是当配合高阶函数使用时。 - 动态性:Lambda表达式可以作为变量,可以在运行时创建和传递,增强了代码的灵活性。 8. **适用场景** Lambda表达式适用于任何...

    你好,Haskell!

    - **Parser Combinators**:Haskell的语法解析库,如`Parsec`,利用高阶函数和组合子来构建解析器,使得解析任务变得模块化和易于理解。 - **Embedded Domain-Specific Languages (DSLs)**:Haskell的强类型系统和...

    python基础及网络编程基础笔记.docx

    高阶函数如map、filter和reduce则展示了函数的威力。map函数接收一个函数和一个可迭代对象,将函数应用于可迭代对象的每个元素并返回一个新的可迭代对象。filter函数根据提供的函数返回值为True的条件,筛选出可迭代...

    python基础(补充):python三大器之装饰器.pdf

    高阶函数可以接受函数作为参数,也可以把函数作为结果值返回。在本文中,我们将学习Python中的闭包、装饰器等高级概念。 1. 闭包(Closure) 闭包是指在函数内部定义的函数,并且内部函数可以引用外部函数的参数和...

    Javascript - 全面理解 caller,callee,call,apply

    这些知识点对于深入理解和优化代码至关重要,尤其在处理高阶函数和面向对象编程时。 首先,让我们来理解`caller`属性。`caller`是一个返回当前函数调用者(即直接调用它的函数)的引用的属性。它通常在函数内部使用...

    Javascript高级教程

    5. **函数式编程**:JavaScript也支持函数式编程风格,如高阶函数、map、reduce、filter等。掌握这些技巧可以写出更简洁、可读性更强的代码。 6. **异步处理**:JavaScript是单线程的,因此异步编程是处理耗时操作...

    深入学习python(PDF)

    5. 函数式编程:Python也支持函数式编程风格,如高阶函数、闭包、lambda表达式和map、filter、reduce等函数。这些特性可以让代码更简洁,易于理解和测试。 6. 生成器:生成器是Python中的一个独特概念,它可以在...

    Python技术参考大全pdf

    书中将介绍函数作为一等公民、高阶函数、匿名函数(lambda表达式)以及map、filter和reduce等函数式编程工具的使用。这些工具能帮助我们写出更简洁、更易读的代码。 对于文件操作和系统交互,Python提供了丰富的...

    Secrets of the JavaScript Ninja

    - “Wielding functions”可能包含高阶函数(Higher-order functions)的概念,以及如何利用它们进行数组和集合的操作。 - “Closing in on closures”这部分将专注于闭包的概念及其在JavaScript编程中的应用,比如...

    ThonkPython

    函数是Python编程的重要组成部分,书中的内容会涵盖函数的定义、参数传递、返回值,以及高阶函数如map、filter和reduce。此外,还将介绍模块和包的使用,这在组织大型项目时显得尤为重要。Python的面向对象编程也会...

    code-aca:JavaScript复习

    高阶函数可以接收函数作为参数或返回函数,闭包则允许函数访问并操作其外部作用域的变量,即使在其定义的函数已经执行完毕后。 模块化是大型项目组织代码的关键。CommonJS和ES6模块是两种常见的模块系统。CommonJS...

    Scalajs是一个将Scala语言编译成JavaScript的工具

    使用 Scala.js 开发时,你可以利用 Scala 的类、对象、特质、高阶函数、模式匹配等特性,同时还能享受到静态类型的强类型检查。这在编写 JavaScript 代码时,能显著减少运行时错误,并提高代码质量。此外,Scala.js ...

    lab_func_practice

    8. **高阶函数**:这些函数可以接收其他函数作为参数,或者返回一个新函数,如`map`、`filter`和`reduce`。 9. **函数柯里化**:这是一种将接受多个参数的函数转化为一系列接受单一参数的函数的技术,使得函数能够...

    aliasplus:Android版Alias游戏

    3. **高阶函数**:游戏逻辑中可能涉及各种操作集合的函数,Kotlin的高阶函数可以方便地处理这些情况,比如用于过滤、映射或减少集合元素。 4. **协程**:在处理异步操作,如网络请求或数据库操作时,Kotlin的协程...

    计算机专业外文翻译THINKINJAVA.pdf

    《忙碌的Java开发者指南到Scala:类行动》是针对Java开发者...在进一步学习Scala的过程中,你会接触到更多的特性,如高阶函数、模式匹配、集合API的优雅设计以及类型系统中的类型类等,这些都是Scala语言的强大之处。

    scala-docs-2.11.1.zip

    此外,它还提供了更强大的类型系统,如类型推断、模式匹配和高阶类型,这些使得编写类型安全的代码变得更加便捷。 在压缩包内的"scala-docs-2.11.1"文件中,你可以找到以下内容: 1. **语言指南**:这部分详细解释...

    C++模板元编程(C++ 领域扛鼎之作,荣耀先生倾情翻译,名著名译) 原书名: C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond

    本书适合中、高阶C++程序员等参考。.. 本书清晰地揭示了现代C++最具威力的使用手法,将实际的工具和技术交付普通程序员的手中。 元编程是产生或操纵程序码的程序。自从泛型编程被引入C++中以来,程序员们已经发现...

Global site tag (gtag.js) - Google Analytics