2013-09-03 9 views
5

Obecnie mam kodu, który wygląda tak:Poszukiwanie zaginionych State COMBINATOR dla Lens

do 
    x <- use foo 
    foo <~ runFoo x 

gdzie foo jest Lens do pola Foo i runFoo :: MonadState m => Foo -> m Foo

myślę, że nie powinno być sposób to zrobić ta operacja w jednym wierszu, ale nie mogę jej znaleźć. Myślę, że powinniśmy mieć komentarz w stylu:

(????) :: MonadState s m => Lens' s a -> (a -> m a) -> m a 

pytania:

  • Czy taki syntezatora istnieje? jeśli tak, to co to jest?
  • Kiedy natknę się na inne pytanie w ten sposób, jaki jest najlepszy sposób na wyszukanie go (tj. Zazwyczaj po prostu wpisuję to w Hoogle, ale nie miałem szczęścia, robiąc to z biblioteką soczewek)
  • to właściwie prymitywny kombinator znaleziony w Control.Monad? (Będę lekko zakłopotany, jeśli jest to kolejna praca za strzałką kleisli)

Odpowiedz

0

typu podpis funkcji, której szukasz jest podejrzanie zbliżony do >>=, ale z pierwszym argumentem innego.

W szczególności wygląda tak, jakby use foo :: Monad m => m Foo i foo <~ runFoo :: Foo -> m Foo, więc można użyć bind bezpośrednio jako use foo >>= (\x -> foo <~ runFoo x). Prawdopodobnie jest łatwiejszy/krótszy sposób, ale nie mam pełnego kodu do zabawy. Powiedziałabym, że wystarczy trzymać się dwóch linii i jeśli jest to operacja dość powszechna, to określ dla niej swój własny kombinator.

+1

Czy rzeczywiście zrobiliście coś więcej, niż po prostu napisali notację Haskella "do"? Ta technika może być używana do łączenia dowolnych dwóch linii w instrukcji 'do'. Chcę scalić 'use' i' (<~) '. –

Powiązane problemy