Czasami chcesz złożyć listę krotek w jedną krotkę, używając różnych funkcji składania. Na przykład, aby skleić ze sobą listę wyników runState, uzyskując (w pewnym sensie) stan połączony i wynik łączony.Używanie strzałek w celu złożenia listy krotek
Rozważmy następujący realizacji:
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
Chociaż to działa, czuję się niezręcznie o tym lambda. lfn *** rfn
sam w sobie ma typ (a,b) -> (a -> a', b -> b')
, którego nie mogę znaleźć sposobu, aby poprawnie zastosować do krotki bez konieczności odwoływania się do dopasowywania wzorca. Czy brakuje mi jasnego i eleganckiego sposobu? Może to być funkcja biblioteczna typu (a,a') -> (a -> a, a' -> a') -> (a, a')
lub całkiem inne podejście.
Pewna klasa BiAplikatywna zrobiłaby .. Prawdopodobnie jest gdzieś w hackage, ale zostawię to innym, aby opisać, które z nich są dobre i nie są przestarzałe. – Carl
http://squing.blogspot.com/2008/11/beautiful-folding.html i jego pojawienie się w Hackage, http://hackage.haskell.org/package/ZipFold –