Scala ma funkcję groupBy
na listach, które akceptują funkcję wyodrębniania kluczy z elementów listy, i zwraca następną listę, w której elementami są krotki składające się z klucza i listy elementów wytwarzających ten klucz. Innymi słowy, coś takiego:Haskell jest odpowiednikiem Scala's groupBy
List(1,2,3,4,5,6,7,8,9).groupBy(_ % 2)
// List((0, List(2,4,6,8)), (1, List(1,3,5,7,9)))
(Właściwie to wygląda w aktualnych wersjach zapewnia on Map
zamiast, ale to nie jest ważne). C# ma jeszcze bardziej użyteczną wersję, która pozwala na mapowanie wartości w tym samym czasie (bardzo przydatne, jeśli, powiedzmy, twoja kluczowa funkcja to tylko wyodrębnianie części krotki).
Haskell ma groupBy
, ale jest nieco inny - grupuje biegi rzeczy zgodnie z pewną funkcją porównania.
Zanim przejdę do pisania, czy istnieje odpowiednik Scala? groupBy
w Haskell? Hoogle nie ma nic takiego, jak oczekiwałbym podpisu (poniżej), ale może się pomyliłem.
Eq b => (a -> b) -> [a] -> [(b,[a])]
Zrobiłem niewielką modyfikację tego, aby dać opcję C# stosowania funkcji na wartości w tym samym czasie: 'myGroupBy fg xs = map (f. head &&& g). groupBy ((==) \ 'on \ f). sortBy (porównaj \ "na \" f) $ xs' – Impredicative
@Impredicative: To wygląda naprawdę bardzo przydatne! –
@Impredicative: 'myCSharpGroupby f g xs = map (drugi g) $ myGroupBy f xs' działałby również – cheecheeo