欢迎道友来到第六章。
经历了第五章"元婴期"Monad 天劫的洗礼,想必你已经领悟了如何处理那些带着"因果气息"的盒子。然而,Monad 虽强,却有时显得过于沉重------每次都要"打开盒子、取出宝贝、重新装盒",是否让你感到一丝繁琐?
今日,我们将步入化神期:万法通识(Functors & Applicatives) 。在这一层境界,你将学会如何施展"隔空取物"与"多重法阵"的神通,不再需要每次都亲手拆解因果。
在 λ 门的道统中,Functor (函子) 、Applicative (应用函子) 和 Monad (单子) 构成了一座完整的修行阶梯。化神期的核心在于:如何在不破坏"上下文(Context)"的情况下,让法术在盒子内部悄然生效。
6.1 隔空斗法:Functor(函子)
Functor 是最基础的化神神通。它的核心法术是 fmap(或者符号 <$>)。
- 境界: 如果一个容器(如
Maybe,[],Either)拥有 Functor 位格,你就可以把一个普通法术投射到盒子内部。 - 心法: <math xmlns="http://www.w3.org/1998/Math/MathML"> f m a p : : ( a → b ) → f a → f b fmap :: (a \to b) \to f \ a \to f \ b </math>fmap::(a→b)→f a→f b。
- 直观感受: 你不需要"打开"盒子。你只需对着盒子施咒,里面的东西就自动进化了。
示例:隔山打牛
Haskell
sql
-- 凡间做法:用 Pattern Matching 拆开 Maybe,加 1,再装回去(累赘)
-- 化神做法:直接投射
let result = (+1) <$> Just 10 -- 结果:Just 11
let void = (+1) <$> Nothing -- 结果:Nothing(法力穿透,不留痕迹)
6.2 众灵归位:Applicative(应用函子)
当你掌握了 fmap,你会遇到一个新的困境:如果法术本身也在盒子里,该怎么办?或者,如果你想把一个需要两个参数的法术,同时作用于两个盒子上?
这时,你需要 Applicative 位格,以及它的本命法宝: <*>(飞星符) 。
- 心法:
(<*>) :: f (a -> b) -> f a -> f b - 演练: 假设你有两个锦囊,分别装着灵力值,你想把它们合而为一。
Haskell
lua
-- 准备一个两数相加的法术,将其"升华"到法阵中
-- pure 会将普通法术包裹进当前位格的盒子里
pure (+) <*> Just 3 <*> Just 5 -- 结果:Just 8
-- 更有仙气的写法(结合 fmap):
(+) <$> Just 3 <*> Just 5 -- 结果:Just 8
神效: 这种写法极其优雅。它像是在写普通的
3 + 5,但实际上它在处理两个可能失败(Maybe)或具有多重因果(List)的变量。
6.3 幻影分身:List 的 Applicative 属性
当 Applicative 作用于列表 [] 时,会产生一种奇妙的"全组合"效果,犹如身化千万。
Haskell
css
-- 将两种攻击方式作用于三个敌人
[(+10), (*2)] <*> [1, 2, 3]
-- 结果:[11, 12, 13, 2, 4, 6]
每一个函数都会作用于每一个元素,这便是**"万法同源,幻影随心"**。
⚡ 化神心得:三者的等位关系
为了防范走火入魔,道友需牢记这三大境界的递进关系:
- Functor (
fmap/<$>): 将一个"凡间函数"作用于"仙界盒子"。 - Applicative (
<*>): 将一个"仙界盒子里的函数"作用于"仙界盒子里的值"。 - Monad (
>>=): 将一个"产生仙界盒子的函数"作用于"仙界盒子里的值",并能根据上一步的结果决定下一步的因果。
📜 化神试炼:第六关
请施展你的化神神通,完成以下推演:
- 隔空炼药: 给定一个
Just 100,请使用<$>将其变为Just "Strength: 100"。 - 多重共鸣: 假设你有两个列表
l1 = [1, 2]和l2 = [10, 20]。请使用 Applicative 风格(<$>和<*>)算出这两个列表中元素两两相乘的所有结果。 - 反思: 为什么有了强大的 Monad,我们还需要学 Functor 和 Applicative?(提示:思考"权限"与"确定性")。
"当你发现自己不再频繁使用 do 记法,而是熟练地祭出 <$> 与 <*> 时,你的神识已经可以游离于具体的因果之外,真正触碰到了泛型编程的精髓。"
下一章预告: 化神圆满后,便是炼虚期:惰性求值与无穷序列(Lazy Evaluation) 。我们将学习如何操控"无穷",并在无限的虚空中截取那一丝确定的真理。