czesc jak bedzie wygladala ta funkcja
liczW x y = length (filter ((==) x) y )
w wersji bezparametrowej czyli bez x i y ?
czesc jak bedzie wygladala ta funkcja
liczW x y = length (filter ((==) x) y )
w wersji bezparametrowej czyli bez x i y ?
Ja mam tylko pomysł jak się pozbyć ys
:
liczW x = length . filter (== x)
liczW = (length .) . filter . (==)
Ładne, prawda? ;)
Edit
Jeśli kogoś ciekawią, kroki prowadzące do rozwiązania:
Zaczynamy od przepisania liczW:
liczW e l = length (filter (== e) l)
Pierwszą rzeczą jaką robimy to wyrzucenie prawie wszystkiego do pomocniczej funkcji (nazwanej foo
, żeby było nieczytelniej):
liczW e l = length $ foo e l
foo e l = filter (== e) l
Jak widać (albo i nie widać), funkcja foo zwraca listę elementów z listy l które są równe e, a liczW zwraca długość tej listy.
Już na dzień dobry, wyrzucamy argument l z foo:
foo e = filter (== e)
A teraz możemy kulturalnie wyrzucić sobie z tego e:
foo = filter . (==)
No a teraz wystarczy podstawić foo w oryginalnej funkcji, przypominam:
liczW e l = length $ foo e l
Pozbyć się jednego argumentu łatwo, od tego mamy kropkę, ale z dwoma jest gorzej - do tego stworzymy magiczny kombinator:
(.:) = (.).(.)
I teraz łącząc:
liczW = length .: (filter . (==))
No i pozbywając się tego kombinatora żeby było brzydziej, otrzymujemy takiego oto potwora:
liczW :: Eq a => a -> [a] -> Int
liczW = ((.).(.)) length $ (filter . (==))
Edit 2
Zasugerowane przez tajemniczego nieznajomego oraz pewnego bota:
((.) . (.)) length $ filter . (==)
Redukuje się do:
((length .) .) $ filter . (==)
A to z kolei do nowej wersji ostatecznej:
(length .) . filter . (==)