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

简介: 表达式是编程语言中最常用到的基础之一,本片让我们来看看在 Haskell 中表达式是怎样的?


判断表达式



if..then..else


表达式是编程语言中最常用到的基础之一,本片让我们来看看在 Haskell 中表达式是怎样的?


先看个小例子感受一下(依然是借助编译器 GHC):


Prelude> isTwo n = if n==2 then True else False
Prelude> isTwo 2
True
Prelude> isTwo 3
False
Prelude> :t isTwo
isTwo :: (Eq a, Num a) => a -> Bool


这是一个非常简单的 if..then..else 表达式,isTwo 是一个函数,n 是入参;可以看到,Haskell 的表达式并没有像在 JS 中的括号进行包裹;


当然,你也可以写像 JS 中的等号运算符;


Prelude> isFive = (==5)
Prelude> isFive 5
True
Prelude> :t isFive
isFive :: (Eq a, Num a) => a -> Bool


和 JS 还有一个大不同是:Hskell 里的 if..then..else 的 else 后的表达式不可省略;

也就是说,必须定义条件成立的时候返回的值,也必须定义条件不成立的时候返回的值,并且两者返回的类型必须相同,这样一定程度上保证了函数定义的完整性。

实际上,if..then..else 是一种结构性的表达式,也可以理解为一种运算符,属于:混合位置运算符


而普通的加法,处于两个参数中间,称为:中缀运算符

函数,位于一个参数前面,可理解为:前缀运算符

函数式编程的“输入 => 计算 => 得值”的思想处处都有体现;


switch


看了 if else ,再看看 switch 怎么写:


Prelude> :{
Prelude| week n = case n of
Prelude|     1 -> "Mon"
Prelude|     2 -> "Tues"
Prelude|     3 -> "Wed"
Prelude|     4 -> "Thurs"
Prelude|     5 -> "Fri"
Prelude|     6 -> "Sat"
Prelude|     7 -> "Sun"
Prelude|     _ -> error "invalid"
Prelude| :}
Prelude> week 4
"Thurs"


Haskell 中无需 break 关键字,当它匹配到一个条件后,就会自动跳出;

_ 下划线是定义默认的其它条件;


模式匹配


还有另一种方式可以表达条件运算 —— 模式匹配;


Prelude> :{
Prelude| abs4 n
Prelude|     | n > 4 = n
Prelude|     | otherwise = -n
Prelude| :}
Prelude> abs4 2
-2
Prelude> :t abs4
abs4 :: (Ord p, Num p) => p -> p

| 将函数的参数按特定的条件分开;

在模式匹配中,更精确更有指向性的模式总是放在相对通用和宽泛的模式前面(优先匹配);


本瓜觉得跟这里的 模式匹配责任链模式 有点类似,按照顺序去匹配,把更有可能正确的条件判断放在最前,优先去执行判断,满足条件立即跳出;


不过 JS 实现责任链要进行封装,Haskell 直接原生语法就支持| 就是对 if..then..else 的封装;


运算符



前文已提到:加号、减号等,这些本质和函数是一样的,函数也是运算符,加减号也是函数!


可以在 GHC 控制台打印类型看看:


Prelude> :t (+)
(+) :: Num a => a -> a -> a
Prelude> :t (-)
(-) :: Num a => a -> a -> a

只不过它们属于不同位置的运算符(前缀、中缀、后缀、混合位置);


实际上,运算符共有 3 个属性

  1. 优先级(在 Haskell 中,有十个优先级(0 ~ 9));
  2. 结合性(分为左结合、右结合、无结合);
  3. 位置(前、中、后、混合);

提供一个优先级和结合性的表:

image.png

图片来源:异步社区


比如运算符 !! :表示从一个列表中取出第 n 个元素(从 0 开始)

Prelude> [1,2,3,4,5]!! 1
2


再比如 mod :表示取余

Prelude> mod 7 2
1


有一个很重要的运算符要特别提醒:$

Prelude> :t ($)
($) :: (a -> b) -> a -> b


用来干嘛的呢?

当你想定义 f (g (h x)) 时,可以简写为 f $ g $ h x ,这样写函数的连续调用更轻便、易读;

Prelude> let f1 = (*2)
Prelude> let f2 = (+1)
Prelude> f1 $ f2 7
16


自右向左调用,回答了之前 compose 自右向左调的原因:与函数书写的嵌套顺序一致;

$$!$!! 后面还有大用处(惰性求值),先在这里作简单认识;


小结



本篇我们又学习了 Haskell 的新的知识点:

  1. if else 是怎么写的,与 JS 差异在哪;
  2. switch 是怎么写的,与 JS 差异在哪;
  3. 模式匹配(与责任链模式类似);
  4. 函数与运算符等价(非常重要)
  5. 运算符的三个属性;
  6. 一些特殊的运算符,比如:!!$ 等;


这些都是为后面揭开 Haskell 函数式编程神秘面纱的基础,期间也能一窥这种把函数当计算的奇妙之处,即使不能在开发生产中用到 Haskell,对于平常的编程思考也是大有裨益的,希望你有受用到~~

以上。



相关文章
|
8天前
|
存储 弹性计算 缓存
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
本文更新了2026年阿里云全系列云服务器租赁活动报价,所有特惠资源均可前往阿里云活动中心选购,整体覆盖从个人入门到企业级高性能场景的全梯度需求。其中轻量应用服务器主打极致性价比,2核2G峰值200M带宽配置每日10点、15点限时抢购价仅38元/年,2核4G配置379元/年起;高性价比的经济型e实例、通用算力型u2i实例覆盖2核4G至4核32G全档位,适配开发测试与中小型企业业务;搭载英特尔至强6处理器的第九代c9i企业级实例算力较上代提升20%,支撑高并发生产环境,不同实例规格价差清晰,用户可根据自身业务负载与预算灵活选型。
1836 118
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
|
9天前
|
人工智能 程序员 API
Codex 接入 DeepSeek-V4-Flash:还能补上识图,提供两套方案
Codex 接入 DeepSeek-V4-Flash 怎么配?本文覆盖 CLI 与桌面端,再用 qwen3-vl-flash 补识图,两套方案可直接照做
1381 11
|
15天前
|
云安全 人工智能 运维
阿里云联动百位企业安全专家,共识Agent防御最佳实践
当Agent成为新员工,你的安全边界在哪里?
1962 9
阿里云联动百位企业安全专家,共识Agent防御最佳实践
|
9天前
|
编解码 人工智能 安全
2核4G/4核8G/8核16G阿里云服务器如何选择实例?经济型e、通用算力型u2i与计算型c9i选哪个?
本文介绍了阿里云2核4G、4核8G、8核16G三档主流配置下经济型e、通用算力型u2i和计算型c9i三种实例的最新活动价格与适用场景。同配置下三者价差显著,以2核4G为例,经济型e低至599.93元/年,计算型c9i则高达1742.08元/年。文章详细解析了各实例的性能定位:经济型e适合轻负载入门场景,u2i兼顾稳定算力与性价比,c9i凭借第9代至强处理器与芯片级安全能力支撑高性能业务。同时提示用户可叠加满减优惠券享受折上折,建议根据业务负载与预算综合决策。
551 113
|
6天前
|
编解码 弹性计算 云计算
MiniMax-H3 视频生成模型 — 一键部署与使用指南
MiniMax-H3是MiniMax开源的33B全模态视频生成模型,支持文生视频、图生视频、参考生视频三种模式,原生输出2K/15秒带立体声音频视频,已原生适配ComfyUI,并可通过阿里云计算巢一键部署。(239字)
|
21天前
|
人工智能 前端开发 Linux
Codex 桌面版安装 + CC Switch 接入第三方 API 完整教程(2026 最新)
2026最新教程:手把手教你安装Codex桌面版,通过CC Switch v3.17.0一键接入Fenno等国产API(兼容OpenAI Responses格式),跳过账号登录,完整启用代码审查、多步任务与上下文感知功能。零基础友好,全程图文实操。(239字)
3223 5
|
9天前
|
人工智能 JSON Shell
2026AI漫剧本地全开源方案(附各个软件模型链接),8G显卡也能流畅运行
这是一套完全本地化部署的AI漫剧生成技术链路:涵盖LLM剧本分镜生成、FLUX文生图(IP-Adapter人脸锁定)、StoryDiffusion时序连贯控制、LTX-2.3唇形同步视频生成,及ComfyUI全流程调度。零云端费用,仅耗硬件算力,单集2–4小时可产出竖屏短视频,适配抖音/B站分发。
|
7天前
|
人工智能 API 开发工具
2026 零基础本地 AI 漫剧完整实操教程(8G 笔记本显卡可用|附可直接复制命令与代码)
本方案提供完全离线、本地运行的漫剧全自动制作流程:RTX3060/4050 8G显卡即可驱动,涵盖Qwen写分镜→ComfyUI统一角色绘图→LTX2.3图生微动画→Qwen3-TTS本地配音→FFmpeg自动合成,全程无水印、免API、不限次。专为低显存优化,解决变脸、闪烁、爆内存三大痛点。(239字)

热门文章

最新文章