Betrachten Sie das Problem der Zerlegung von Millisekunden in lesbare Zeiteinheiten. Stellen Sie sich eine Funktion hatte, die dasEine ganze Zahl in Blöcke zerlegen, funktionell
> breakupMillis(100000000)
Array [ 0, 40, 46, 3, 1 ]
was bedeutet, dass 100 Millionen Millisekunden haben 1 Nacht, 3 Stunden, 46 Minuten und 40 Sekunden genau.
Die Funktion könnte durch die Annahme einer Reihe von Modulen verallgemeinert werden, wie diese
> breakup(100000000, [1000, 60, 60, 24])
Array [ 0, 40, 46, 3, 1 ]
Diese Funktion (hypothetisch) für andere Dinge verwendet werden könnten:
> breakup(1000, [8, 8, 8])
Array [ 0, 5, 7, 1 ]
was bedeutet, dass in dezimal 1000 01750 in Oktal. Hier
ist die Funktion, die ich schrieb, dies zu tun:
const breakup = (n, l) => l.map(p =>
{ const q = n % p; n = (n - q)/p; return q; }).concat(n);
Diese Funktion ist in Ordnung, es ist sogar referentiell transparent, aber ich habe zwei, ganz ästhetisch, Beschwerden.
- die
map
. Das fühlt sich an wie ein Job fürreduce
, obwohl ich nicht sehe, wie. - Umschreiben der Variablen
n
. Ich mag es überhaupt nichtvar
zu verwenden; mit einem Geheimnisvar
macht es schlimmer.
Meine Frage betrifft nur die zweite. Wie schreibe ich die Funktion neu, so dass sie keine Variable verwendet (die tatsächlich variieren)? Wenn die map
verschwindet, nehme ich das als Soße.
habe ich irgendwie das Gefühl, das auf Codereview – Tschallacka
In Haskell gehört: ' breakup nl = zipMit mod l. scanl div n l ' – Bergi