In Haskell gibt es zwei Funktionen, mit denen man eine Liste von Elementen auf einen einzigen Wert reduzieren kann. (Es gibt natürlich mehr als zwei, aber das sind die beiden, an denen ich interessiert bin.) Sie lauten foldl1
y foldr1
. Wenn der auszuführende Vorgang kommutativ (z. B. Addition), spielt es keine Rolle, welche dieser Methoden Sie verwenden. Das Ergebnis wird dasselbe sein. Wenn die Operation jedoch no kommutativ (z. B. Subtraktion), dann führen die beiden zu sehr unterschiedlichen Ergebnissen. Zum Beispiel:
foldr1 (-) [1..9]
foldl1 (-) [1..9]
Die Antwort auf die erste Frage lautet 5 und auf die zweite Frage -43. Das J-Äquivalent von foldr1
ist das eingefügte Adverb, /
, z.B.,
-/ 1+i.9
was gleichbedeutend ist mit foldr1 (-) [1..9]
. Ich möchte ein Adverb in J erstellen, das wie das Adverb einfügen funktioniert, aber nach links statt nach rechts faltet. Das Beste, was mir eingefallen ist, ist das Folgende:
foldl =: 1 : 'u~/@|.'
Man könnte also sagen:
- foldl 1+i.9
und erhalte -43 als Antwort, was bei einer Linksfalte zu erwarten ist.
Gibt es eine bessere Möglichkeit, dies in J zu tun? Aus irgendeinem Grund ist die Umkehrung der y
Argument scheint mir nicht effizient zu sein. Vielleicht gibt es eine Möglichkeit, dies zu tun, ohne darauf zurückgreifen zu müssen.