2013-09-03 11 views
5

Ich habe derzeit Code, der wie folgt aussieht:Suche nach fehlenden Staats Combinator für Objektiv

do 
    x <- use foo 
    foo <~ runFoo x 

wo foo ist ein Lens zu einem Foo Feld und runFoo :: MonadState m => Foo -> m Foo

Ich denke, sollte es eine Möglichkeit geben, zu tun diese Operation in einer Zeile, aber ich kann es nicht finden. Ich denke, es sollte einen Kommentar haben wie:

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

Fragen:

  • Gibt es eine solche combinator existieren? Wenn ja, was ist das?
  • Wenn ich auf eine andere Frage wie diese stoße, was ist der beste Weg, um danach zu suchen (dh Normalerweise würde ich dies nur in Hoogle schreiben, aber ich hatte kein Glück mit der Objektivbibliothek)
  • das ist eigentlich ein primitiver Kombinator in Control.Monad gefunden? (Ich werde ein wenig verlegen, wenn dies ist noch eine weitere Aufgabe für den Kleisli Pfeil)

Antwort

0

Die Art Signatur der Funktion die Sie suchen, ist verdächtig nahe der >>=, aber mit dem ersten Argument anders.

Insbesondere scheint es, als ob use foo :: Monad m => m Foo und foo <~ runFoo :: Foo -> m Foo, so dass Sie Bindung direkt als use foo >>= (\x -> foo <~ runFoo x) verwenden könnten. Es gibt wahrscheinlich einen einfacheren/kürzeren Weg, aber ich habe nicht den vollen Code, um damit herumzuspielen. Ich würde sagen, bleiben Sie einfach bei der Verwendung von zwei Zeilen, und wenn es eine übliche Operation ist, dann definieren Sie Ihren eigenen Kombinator dafür.

+1

Haben Sie tatsächlich etwas mehr getan, dann einfach Hagkells "do" -Notation? Diese Technik kann verwendet werden, um zwei beliebige Zeilen in einer "do" -Anweisung zu kombinieren. Ich möchte 'use' und' (<~) 'zusammenführen. –