Haskell带你玩转函数 您所在的位置:网站首页 haskell函数定义 Haskell带你玩转函数

Haskell带你玩转函数

2023-10-03 06:26| 来源: 网络整理| 查看: 265

函数,再简单不过的概念。不管是什么范式的编程语言,都离不开用函数来表达逻辑。而函数式编程,当然核心就是函数。但函数式编程中的函数与其他语言有什么区别呢?本节都带着大家领略一下Haskell中强大的函数。这也是我们最应该从Haskell中学习,如果你觉得Haskell或其他函数式语言中的其他概念都太复杂太学术,那函数就是你至少应该从中收益的。再回到日常项目的非函数式语言时,学会领悟如何识别概念、分析数据流,然后设计一个简洁而通用的函数,并在此之上构建起更复杂的抽象。而不是一股脑地传入10个参数,然后在函数内写上一千行的逻辑,再交给别人去维护。

1.理论基础 1.1 Partially Applied

一个令初学者难以置信的事实是:Haskell中的函数都只接受一个入参。那为什么我们可以定义任意个参数的函数呢?答案就是Curry化。所谓Curried函数就是指:不直接接受多个参数,而是每次接受一个入参,同时返回一个函数接受剩下的参数。返回的函数也叫Partially Applied函数。在Python中我们也能看到类似的概念,即itertools.partial()函数。传入一个函数和部分参数得到一个新函数,用起来很方便,正确使用的话能够增加函数的重用度,减少重复代码。

Prelude> let mul x y = x * y Prelude> let mul2 = mul 2 Prelude> mul2 3 6 Prelude> mul2 5 10

同样的,因为Curry化,函数的定义可以更加简洁,比如下面两种写法是等价的。

Prelude> foo a = bar b a Prelude> foo = bar b 1.2 一次性函数:Lambda

大家应该很熟悉用Lambda表达式定义匿名函数,在主流的Python、Java里都有支持,甚至在Java 8之前我们已经有用匿名内部类的习惯,尤其是Swing图形化编程。Haskell中Lambda也一样,但更强大的一点是Haskell的Lambda也像普通函数一样支持模式匹配,但是你只能定义一个模式。如果不匹配,则会抛出运行时异常。

Prelude> map (\(a,b) -> a + b) [(1,2),(3,5),(2,6)] [3,8,8] 2.玩转函数

通过Curry化,我们能够产生大量可用的函数,这在其他非函数式编程语言里是无法想象的。有了这样的可能性,在开发新函数时我们就会特别注意,让自己的函数更加通用、可重用。下面就来看看有了Curry,我们都可以做什么。

2.1 Section

因为Haskell还支持Infix中缀函数,Infix函数也可以通过Section变成Partially Applied函数。什么是Section呢?就是只提供任意一侧的参数,并用括号括起来得到一个新的函数。

Prelude> let add2 = (2+) Prelude> add2 3 5 Prelude> add2 5 7 Prelude> let


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有