Manchmal möchten Sie eine Liste von Tupeln in ein Tupel mit verschiedenen Faltfunktionen falten. Zum Beispiel, um eine Liste von runState-Ergebnissen zusammenzuhalten, um einen (in gewissem Sinne) kombinierten Zustand und ein kombiniertes Ergebnis zu erhalten.Verwenden von Pfeilen zum Falten einer Liste von Tupeln
Betrachten Sie die folgende Umsetzung:
wish :: (a -> a' -> a) -> (b -> b' -> b) -> (a,b) -> [(a', b')] -> (a,b)
wish lfn rfn x xs = foldl (\(a,b) -> (lfn a) *** (rfn b)) x xs
Obwohl es funktioniert, ich fühle mich unwohl zu diesem Lambda. lfn *** rfn
an sich hat eine Art von (a,b) -> (a -> a', b -> b')
, die ich nicht finden kann eine Möglichkeit, auf ein Tupel ordnungsgemäß anwenden, ohne jemals auf Mustererkennung zurückgreifen. Gibt es eine klare und elegante Art, die ich vermisse? Es könnte eine Bibliotheksfunktion vom Typ (a,a') -> (a -> a, a' -> a') -> (a, a')
oder ein ganz anderer Ansatz sein, vielleicht.
Irgendeine Art von BiApplicative-Klasse würde tun .. Es gibt wahrscheinlich einen irgendwo im Hack, aber ich werde es anderen überlassen, um zu zeigen, welche gut und nicht veraltet sind. – Carl
http://squing.blogspot.com/2008/11/beautiful-folding.html und seine Instantiierung auf Hackage, http://hackage.haskell.org/package/ZipFold –