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

haskell编程学习笔记(一) 高阶函数

阅读更多

我今天所记录的学习笔记主要来自3个来源:

  1. 这段时间学习haskell语言编程的实践经验
  2. John Backus的Can Programming Be Liberated from the von Neumann Style?  由于数学基础过于薄弱,我只能说“读完”而不是“读懂”这篇论文,强烈建议大家读原文
  3. John Hughes why functional programming matters
John Backus的论文中所述的函数式编程VS冯诺依曼式编程类似于haskell中提到的函数式编程VS命令式编程(希望我没有误读)

 我用java和haskell分别实现该论文中的求内积方法,即,给定[a,b,c]和[x,y,z]求 sum = a*x + b*y + c*z
public static int innerProduct(int[] xs,int[] ys){
        int sum = 0;                                                        //(1)
        for ( int i=0;i<xs.length;i++){                             //(2)
                sum = sum + xs[i] * ys[i];
        }
        return sum;
}                                                                                 //(3)
(1) java的实现必须多定义一个变量
(2) 循环变量i 并不存在于问题中(即求 sum = a*x + b*y + c*z 这个问题里并没有i的存在)
(3) John Backus的论文指出我们必须在脑子里“运行”这个传统编程语言的代码才能理解其含义。 
也就是说我们读这段代码的时候其实是把自己当作人肉计算机在脑子里顺序解释执行这些代码。

innerProduct :: [Int] -> [Int] -> Int
innerProduct xs ys = sum $ zipWith (*) xs ys
 haskell的版本是个典型的函数式语言实现,展现了高阶函数(high order function)的威力,并且避免了上述的3个问题
zipWith 是个函数, 接受3个参数,形如: zipWith f xs ys,其中第一个参数f是另一个函数(函数当作参数传递),此函数接受两个参数并返回一个结果,在这个例子里是 (*),也就是乘积。xs 和 ys是两个集合(haskell里是List类型),zipWith将函数f应用在两个集合的对应元素上,并将结果组成另一个集合作为结果。
sum函数将集合的每个元素进行累加。
所以这段代码的意思就是把集合xs和ys的对应元素乘起来,然后将结果集合的每个元素累加起来。
haskell的代码就是这段代码所做的事的直观描述,一旦习惯了haskell的写法,就会发现haskell代码的可读性要好得多。

高阶函数(即可以接受函数作为参数)使程序的扩展性大增,
加入不想求乘积了,想求和怎么版呢?将(*)改成(+),这个是最简单的扩展。
假如你想把xs集合的每个元素与ys集合的每个元素做个比较,x>y大于则为True,否则false,要怎么实现呢?
(>)也是一个能接受两个参数,返回一个结果的函数哦!
isLarger :: [Int] -> [Int] -> [Bool]
isLarger xs ys = zipWith (>) xs ys
 
正如why functional programming matters 论文中所说的,函数式编程给语言加入了一个重要的“胶水机制“--高阶函数,可以用来将小块的功能块组合为大的功能块。这个机制是非常有价值的。
分享到:
评论

相关推荐

    haskell-programming:“从第一原理开始的Haskell编程”一书的练习笔记和解决方案

    通过解决书中给出的练习,读者可以逐步掌握Haskell的编程技巧,包括如何定义函数、处理数据结构、使用高阶函数以及编写复杂的类型系统。 在"压缩包子文件的文件名称列表"中,我们看到只有一个文件夹名为"haskell-...

    学习您的haskell笔记本:Jupyter改编的《 Learn a Haskell for Great Good!

    学习Haskell可以帮助我们理解函数式编程的基本概念,如高阶函数、范畴论基础、不可变数据结构和类型类等。 Jupyter Notebook则是一个开放源代码的Web应用程序,它允许用户创建和共享包含代码、方程式、可视化和文本...

    haskell-concepts-mindmap:学习haskell笔记

    - 高阶函数可以接受函数作为参数,也可以返回函数,如 `map` 和 `filter`。 4. **惰性求值** - 惰性求值策略延迟计算,直到其结果真正需要时才进行。 - 这种特性在处理无限数据结构(如无穷列表)时非常有用,且...

    haskell-mooc:Haskell MOOC赫尔辛基大学

    此外,课程还可能探讨高级特性,如高阶函数、模式匹配、类型推导以及类型系统的灵活性,例如GADTs(通用关联类型)和rank-N types。 【标签】"haskell course mooc university-of-helsinki mooc-fi HaskellHTML" ...

    haskell-cs194:Haskell 通过 http 播放

    2. 高阶函数:map、filter、fold等,以及如何使用它们进行函数组合和数据处理。 3. Monads:理解monads的概念,如IO、Maybe、List等monad,以及如何使用do notation进行monadic操作。 4. Lazy Evaluation:了解惰性...

    北科大大鱼吃小鱼。。。

    2. **高阶函数**:可以接受一个或多个函数作为参数,并返回一个新的函数的函数。 3. **不可变数据**:数据一旦创建,就不能被改变。这有助于避免并发问题,提高代码的可预测性和可测试性。 4. **函数组合**:将简单...

    haskelling:学习Haskell的个人资料库

    "haskelling:学习Haskell的个人资料库"显然是一个专注于Haskell编程的学习资源集合,可能包含了教程、代码示例、笔记和其他相关材料。这个资料库可能是某位开发者在学习Haskell的过程中积累的知识宝库,旨在帮助其他...

    Fundamental-Haskell:基本的Haskell书,以简洁的方式阐述了Haskell,类别理论和相关领域。 百科全书的意义。 禅宗禅般的理解冥想。 用于快速或记忆曲线间隔的重复学习

    了解Haskell的基础知识,包括数据类型、类型系统、高阶函数和模式匹配,将为你的编程思维带来全新的视角。 类别理论是数学的一个分支,它为理解和比较不同类型的结构提供了通用的语言。在Haskell中,类别理论的概念...

    fp-notes:代尔夫特大学函数编程课程的注释

    2. **高阶函数**:高阶函数可以接受一个或多个函数作为参数,或者返回一个函数作为结果。在函数编程中,高阶函数是实现抽象和模块化的重要工具,例如`map`、`filter`和`reduce`等。 3. **递归**:函数编程中,递归...

    Haskell_sugoi

    四、高阶函数 Haskell中的函数可以接受函数作为参数,也可以返回函数。这种特性使得函数式编程能实现代码复用和抽象,例如map、filter和fold等函数。 五、类型类 类型类是Haskell中的一种泛型机制,允许为多种类型...

    haskell-eXchange-2015

    此外,Haskell支持高阶函数,如map、filter和foldl/foldr等,这些函数允许对集合进行通用操作,极大地提高了代码的简洁性和复用性。在Haskell eXchange 2015上,许多演讲都围绕着如何利用这些特性构建高效、优雅的...

    Learning-haskell:主要是胡言乱语,不要理会它

    高阶函数是常见的,它们可以接受函数作为参数,也可以返回函数。例如,`map`函数可以将一个函数应用到列表的所有元素上,`filter`则可以筛选满足条件的元素。Haskell还支持模式匹配,允许我们基于不同的数据结构或值...

    Learning-Tracker:跟踪我成为专门从事函数式编程的后端开发人员的进度; 以及我阅读和观看的所有内容

    函数式编程强调函数的组合,通过高阶函数和柯里化实现代码复用,使用纯函数避免副作用,以及利用惰性求值优化性能。此外,函数式编程还引入了诸如monads这样的高级概念,帮助处理异步操作和状态管理。 总的来说,这...

    oplss-notes-2018:OPLSS 2018的笔记和讲义

    - **高阶函数**:Haskell中广泛使用高阶函数,它们可以接受其他函数作为参数,或者返回一个函数作为结果。 - **惰性求值**:Haskell采用惰性求值策略,只有在真正需要计算结果时才会执行计算,这有助于优化性能和...

    CIS-194:对 CIS 194 的回答 http

    1. **函数式编程基础**:了解Haskell的基本语法、类型系统、模式匹配、高阶函数、列表操作等。 2. **纯函数编程**:理解无副作用和状态的概念,以及如何在Haskell中实现这些特性。 3. **类型推导**:学习如何利用...

    lambda-talks:布拉格 Lambda 聚会过去会谈的笔记和链接

    1. **函数式编程基础**:讨论了函数式编程的基本原则,包括纯函数、高阶函数、柯里化、递归和组合子等概念。参与者可能深入探讨了这些概念如何改善代码质量、提高程序的可测试性和可维护性。 2. **Lambda表达式的...

    cs141主题

    2. **高阶函数**:这些是接受其他函数作为参数或返回函数的函数,例如`map`、`filter`和`reduce`。它们可以用于处理列表和其他数据结构,实现代码复用。 3. **纯函数**:如前所述,纯函数是无副作用的,它们仅依赖...

    notescript:NoteScript语言,用于描述P2P市场上的投资

    NoteScript的语法可能包括一系列的控制结构,如条件语句(if-else)、循环(可能使用高阶函数实现,如map、filter和reduce)以及函数定义。此外,为了处理时间相关的投资逻辑,可能还会有日期和时间操作的内置函数。...

    Books:我的幻灯片和笔记

    1. **函数式编程基础**:幻灯片可能从函数式编程的基本概念开始,如纯函数、高阶函数、柯里化等,解释它们在Agda中的实现和应用。 2. **依赖类型**:详细讲解依赖类型系统如何在Agda中工作,以及它如何帮助确保代码...

    Pemograman-lanjut-semester-2:源代码2 Andhika prasetyo

    3. 函数式编程:可能涉及像JavaScript、Haskell或Lisp等语言,理解函数作为一等公民、纯函数、高阶函数、闭包等特性。 4. 网络编程:TCP/IP协议、HTTP协议,客户端-服务器模型,网络请求的发送与接收,可能通过...

Global site tag (gtag.js) - Google Analytics