第六章:化神之境与万法同源

欢迎道友来到第六章

经历了第五章"元婴期"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]

每一个函数都会作用于每一个元素,这便是**"万法同源,幻影随心"**。


⚡ 化神心得:三者的等位关系

为了防范走火入魔,道友需牢记这三大境界的递进关系:

  1. Functor (fmap / <$>): 将一个"凡间函数"作用于"仙界盒子"。
  2. Applicative (<*>): 将一个"仙界盒子里的函数"作用于"仙界盒子里的值"。
  3. Monad (>>=): 将一个"产生仙界盒子的函数"作用于"仙界盒子里的值",并能根据上一步的结果决定下一步的因果。

📜 化神试炼:第六关

请施展你的化神神通,完成以下推演:

  1. 隔空炼药: 给定一个 Just 100,请使用 <$> 将其变为 Just "Strength: 100"
  2. 多重共鸣: 假设你有两个列表 l1 = [1, 2]l2 = [10, 20]。请使用 Applicative 风格(<$><*>)算出这两个列表中元素两两相乘的所有结果。
  3. 反思: 为什么有了强大的 Monad,我们还需要学 Functor 和 Applicative?(提示:思考"权限"与"确定性")。

"当你发现自己不再频繁使用 do 记法,而是熟练地祭出 <$><*> 时,你的神识已经可以游离于具体的因果之外,真正触碰到了泛型编程的精髓。"


下一章预告: 化神圆满后,便是炼虚期:惰性求值与无穷序列(Lazy Evaluation) 。我们将学习如何操控"无穷",并在无限的虚空中截取那一丝确定的真理。

相关推荐
Lupino3 小时前
第九章:类型黑魔法与推演天机
haskell
Lupino3 小时前
第五章:元婴天劫与单子(Monad)法阵
haskell
Lupino3 小时前
第七章:虚空造物与无尽真言
haskell
Lupino4 小时前
第三章:高阶法宝与无名法印
haskell
Lupino4 小时前
第四章:天道位格与诸法契约
haskell
Lupino4 小时前
☁️ Haskell 程序员的修仙境界
haskell
Lupino4 小时前
第二章:递归禁地与法相化生
haskell
Lupino5 小时前
第一章:入山与灵根测试(类型之美)
haskell
Lupino15 小时前
实战记录:使用 Haskell.nix 交叉编译 Haskell 项目至 Windows
windows·haskell