Dla kontrprzykład, niech najpierw zdefiniować nowy typ danych, dla których z przechodzenia wygenerować za pomocą makePrisms
:
data T = A T | C deriving Show
makePrisms ''T
_A :: Traversal T T
jest teraz ważne przejścia. Teraz skonstruować nowy przechodzenie przy użyciu failing
:
t :: Traversal' T T
t = failing _A id
Uwaga, (C & t .~ A C) ^.. t = [C]
, który wygląda, jakby to nie prawo przejścia (wy nie „dostać to, co można umieścić w”). Rzeczywiście, drugie prawo przejścia jest:
fmap (t f) . t g ≡ getCompose . t (Compose . fmap f . g)
który nie jest zadowolony, jak widać z poniższego wyboru f
i 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)
wówczas:
> getConst . runIdentity . fmap (t f) . t g $ C
[C]
While :
> getConst . runIdentity . getCompose . t (Compose . fmap f . g) $ C
[A C]
Tak więc rzeczywiście istnieje przypadek, w którym failing
z poprawnymi ruchami nie daje prawidłowego przejścia.
Za to, co jest warte, nie widzę, w jaki sposób może to spowodować nieprawidłowe przechodzenie. –