You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何列表[]的Traversable实例符合自然律?求答疑

关于Traversable自然律的疑问

Traversable 实例需满足三条定律:自然律(Naturality)、恒等律(Identity)、复合律(Composition)。其中自然律的表述为:

t . traverse f = traverse (t . f)

但我在两个示例中发现这条定律似乎不成立,想请教各位我哪里理解有误:

示例1

t (Just a) = Left a
f = Just 
s = "string"

> t . traverse f $ s
  Left "string"
> traverse (t . f) s 
  Left 's'

有人可能会指出Either a b的 Applicative 实例是针对b而非a,但这个例子看起来仍能证明列表[]的 Traversable 实例不满足自然律。

示例2

t (head : tail) = replicate 2 head
f = (:[])
s = "string"

> t . traverse f $ s
  ["string", "string"]
> traverse (t.f) s 
  ["string", "string", ...., "string"]
-- 含64个元素的列表
-- 等价于:replicate 64 "string"

这是因为列表的 Applicative 实例特性会生成笛卡尔积,而ZipList数据类型的 Applicative 实例行为不同,能够满足自然律。

想请教各位,我哪里理解错了?为何列表[]的 Traversable 实例是符合定律的?


内容的提问来源于stack exchange,提问作者Devstian Iornest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:15:44