为何列表[]的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
相关产品推荐
相关产品推荐

