15

文档中

尝试第一个Traversal(或),如果它没有返回条目,则返回Fold第二个Traversal(或)。Fold

这仅Traversal在第二个Traversal与第一个的结果不相交或返回完全相同的结果时才有效。

是否有一个生成的无效遍历的简单示例failing和演示它的测试用例?

4

1 回答 1

7

对于反例,让我们首先定义一个新的数据类型,我们使用以下方法生成遍历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有效遍历不会产生有效遍历的情况。

于 2014-11-27T13:41:52.203 回答