欢迎来到第二章。在第一章中,你已经完成了"引气入体",习惯了不可变的数据与严苛的类型。
现在,我们要进入 λ 门最著名的试炼之地------递归禁地(The Forbidden Grounds of Recursion) 。在这里,你将彻底忘掉凡间的"循环",学会如何用灵魂的自我重叠来操纵时空。
在 Java、Python 等凡间宗门,弟子们习惯使用 for 和 while 这种"外力"来重复执行任务。但在 Haskell 的修仙界,循环是不存在的。
如果你想重复,你就要成为那个重复本身。
2.1 破除执念:斩断循环
在 Haskell 中,我们不命令计算机"做十次",我们定义什么是"结果"。
- 凡人心态: "先设 <math xmlns="http://www.w3.org/1998/Math/MathML"> i = 0 i=0 </math>i=0,只要 <math xmlns="http://www.w3.org/1998/Math/MathML"> i < 10 i < 10 </math>i<10,就一直跑,跑完 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 加 1。"(容易产生步长错误,走火入魔)
- 修仙心态: "一个任务的完成,等于处理完当前这一步,再加上'完成剩下所有步骤'。"
心法: 递归即是轮回,而每一个轮回都必须有一个尽头(Base Case) ,否则便会陷入"永恒放逐"(无限递归),直到耗尽元神(Stack Overflow)。
2.2 法相化生:模式匹配(Pattern Matching)
在进入递归之前,你必须掌握模式匹配。这是一种"一眼看穿因果"的神通。它允许你根据输入数据的"形状"直接施展不同的法术。
示例:判定灵根
Haskell
ini
assessTalent :: String -> String
assessTalent "Haskell" = "天纵之才,直取大乘!"
assessTalent "C++" = "根基扎实,然需防心魔。"
assessTalent _ = "凡骨一具,再悟修行。"
那个 _ 符号被称为万能占位符,象征着"众生平等",匹配任何未被捕获的情况。
2.3 递归实战:列表的奥秘
在 Haskell 中,列表(List)不是一排整齐的抽屉,而是一串相互链接的因果。
一个列表 [1, 2, 3] 在修仙者眼中其实是:1 : (2 : (3 : []))。
:(Cons) :将一个元素与后续的因果连接起来。[](Nil) :虚无,所有递归的终点。
试炼:计算灵石总数
假设你有一袋灵石 [Int],我们要算出总和:
Haskell
sql
sumLingshi :: [Int] -> Int
sumLingshi [] = 0 -- 终点:空袋子里没有灵石
sumLingshi (x:xs) = x + sumLingshi xs -- 轮回:当前这一颗(x) + 剩下袋子(xs)的总和
2.4 进阶心法:数学归纳法
递归的逻辑完美契合数学归纳法。以阶乘(Factorial)为例,其数学表达为:
<math xmlns="http://www.w3.org/1998/Math/MathML"> n ! = { 1 if n = 0 n × ( n − 1 ) ! if n > 0 n! = \begin{cases} 1 & \text{if } n = 0 \\ n \times (n-1)! & \text{if } n > 0 \end{cases} </math>n!={1n×(n−1)!if n=0if n>0
在 Haskell 中,这几乎是 1:1 的神还原:
Haskell
ini
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
⚡ 渡劫警示:尾递归与惰性
在禁地行走时,若递归层级太深,元神(内存)可能会崩溃。虽然 Haskell 有惰性求值(Lazy Evaluation)护体,可以处理无穷大的序列(例如:[1..] 是一个包含所有正整数的无限列表),但在处理大规模数值计算时,仍需修习尾递归优化 (即 foldl' 等进阶法门),此为后话。
📜 筑基试炼:第二关
请在你的鼎炉(GHCi)中尝试炼制以下法术:
-
分身术: 编写一个
replicate' :: Int -> a -> [a]函数。- 例如:
replicate' 3 "灵丹"应该返回["灵丹", "灵丹", "灵丹"]。
- 例如:
-
寻宝术: 编写一个
elem' :: Eq a => a -> [a] -> Bool函数,判断某个宝物是否存在于列表中。
"当你不再思考'如何循环',而开始思考'它是什么'时,你的道行便深了一层。"
下一章预告: 我们将走出禁地,迎接修仙路上最著名的三大法宝:Map (造化) , Filter (筛选) , Fold (归一) 。