从文档中:
尝试第一个
Traversal
(或),如果它没有返回条目,则返回Fold
第二个Traversal
(或)。Fold
这仅
Traversal
在第二个Traversal
与第一个的结果不相交或返回完全相同的结果时才有效。
是否有一个生成的无效遍历的简单示例failing
和演示它的测试用例?
从文档中:
尝试第一个
Traversal
(或),如果它没有返回条目,则返回Fold
第二个Traversal
(或)。Fold
这仅
Traversal
在第二个Traversal
与第一个的结果不相交或返回完全相同的结果时才有效。
是否有一个生成的无效遍历的简单示例failing
和演示它的测试用例?
对于反例,让我们首先定义一个新的数据类型,我们使用以下方法生成遍历makePrisms
:
data T = A T | C deriving Show
makePrisms ''T
_A :: Traversal T T
现在是一个有效的遍历。现在,使用 构造一个新的遍历failing
:
t :: Traversal' T T
t = failing _A id
请注意(C & t .~ A C) ^.. t = [C]
,它看起来像遍历定律(你没有“得到你输入的东西”)。事实上,第二遍历定律是:
fmap (t f) . t g ≡ getCompose . t (Compose . fmap f . g)
这是不满意的,可以从 和 的以下选择中f
看出g
:
-- getConst . t f = toListOf t
f :: T -> Const [T] T
f = Const . (:[])
-- runIdentity . t g = t .~ A C
g :: T -> Identity T
g = pure . const (A C)
然后:
> getConst . runIdentity . fmap (t f) . t g $ C
[C]
尽管:
> getConst . runIdentity . getCompose . t (Compose . fmap f . g) $ C
[A C]
因此,确实存在failing
有效遍历不会产生有效遍历的情况。