热爱函数式的你,句句纯正的 Haskell【函数篇】

简介: Haskell 值与函数是统一的,函数只是需要其他参数输入的值。如果定义的是函数,那么这个函数的行为在运行过程中也是不会改变的,对于某一个特定的输入返回的结果总是确定的,这样的函数为纯函数。


函数本质



Haskell 里变量的值在绑定后不会改变,所有变量一定意义上可以理解为定值。

无论如何,定义过的值是没法再改变的。


Haskell 值与函数是统一的,函数只是需要其他参数输入的值。如果定义的是函数,那么这个函数的行为在运行过程中也是不会改变的,对于某一个特定的输入返回的结果总是确定的,这样的函数为纯函数。


有人觉得不改内存状态的想法听上去很荒诞,甚至觉得这样是没有办法做计算的。其实,这两种想法都是错误的。不改变内存状态自有道理,而其它编程语言可以完成的工作,Haskell 一样可以完成。


再三强调,在 Haskell 中,函数与值没有本质的区别,它可以是单一的定值,也可以是任意两个函数间的映射;


实际上,在 Haskell 世界里,所有的运算符号都可以被看做是函数,如加号 + 是一个需要两个参数的函数。


Prelude> (+)5 7
12


函数定义



直接上干货~

实现:f(x) = 4x+ 1


Prelude> f1(x)=4*x + 1
Prelude> f1 4
17
Prelude> :t f1
f1 :: Num a => a -> a


再比如实现:f(x,y) = 4x+ 5y+ 1,

我们可以设想到这个函数的类型是:


f2 :: Num a => (a, a) -> a


验证一下:


Prelude> f2(x,y)=4*x+5*y+1
Prelude> f2(4,3)
32
Prelude> :t f2
f2 :: Num a => (a, a) -> a


确实如此;b( ̄▽ ̄)d

Haskell 中定义的函数的大致格式是这样的:


// 定义方式 1
函数名 (参数1,参数2,...) = 函数体
// 定义方式 2
函数名 参数1 参数2.. =函数体
// 类型
函数名 :: 参数1的类型->参数2的类型->...->结果类型


说这么多,不如在编译器中感受感受:


Prelude> f3 x y z=3*x+2*y-z
Prelude> f3 1 2 3
4
Prelude> :t f3
f3 :: Num a => a -> a -> a -> a


我们惊人的发现,从定义方式 1 到 定义方式 2 的过程,就是柯里化的过程!


λ表达式



Haskell 还有另外一种书写函数的格式,即 λ 表达式;

// 定义方式 3
函数名= (\参数1 -> \参数2 -> ... ->函数体)


示例:

Prelude> f4= (\x -> \y -> x*y)
Prelude> f4 2 3
6
Prelude> f5 =(\x -> \y->4*x+5*y+1)
Prelude> f5 2 3
24


在使用一些高阶函数时,如果不想定义新函数,可以使用 λ 表达式来定义这个函数:

Prelude> map(\x->2*x+7)[1..10]
[9,11,13,15,17,19,21,23,25,27]


\x -> 2*x+7 是一个没有名字的匿名函数,在 Haskell 中,通常用 λ 表达式来构造匿名函数;


阶段小结



小结中,我们再来回归三种定义函数的方式:

// 方式 1:
f2(x,y)=4*x+5*y+1
// 方式 2:
f3 x y z=3*x+2*y-z
// 方式 3:
f4= (\x -> \y -> x*y)


函数作为 Haskell 基础之基础,牢记 3 种函数定义的方式则是基础之基础之基础。

第 1 种方式到 第 2 种方式是柯里化思想的体现。柯里化如此自然,就像呼吸一般~还有 λ 表达式,是实现匿名函数的有效方式!!


以上,真的要在编译器中敲一敲才会有更多体验。看看不同语言对于函数申明及调用的不同实现,体会函数式编程参数在函数中的输入、传递 ......


我是掘金安东尼,输出暴露输入,技术洞见生活,再会~


相关文章
|
编解码
VirtualBox安装虚拟机后分辨率调不对怎么办
VirtualBox安装虚拟机后分辨率调不对怎么办
901 0
|
2天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
265 116
|
17天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
12天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
656 220
|
5天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
328 32
Meta SAM3开源:让图像分割,听懂你的话
|
10天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1517 157