2014-11-25 10 views
15

Od the documentation:Dlaczego "niepowodzenie" (z obiektywu) powoduje nieprawidłowe ruchy?

Spróbuj najpierw Traversal (lub Fold), spada z powrotem na drugim Traversal (lub Fold) Jeśli zwróci żadnych wpisów.

To jest tylko poprawna Traversal, jeśli druga Traversal jest rozłączna z wyniku pierwszego lub zwraca dokładnie takie same wyniki.

Czy istnieje prosty przykład nieprawidłowego przejścia generowanego przez failing i przypadek testowy demonstrujący to?

+1

Za to, co jest warte, nie widzę, w jaki sposób może to spowodować nieprawidłowe przechodzenie. –

Odpowiedz

7

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.