Ich lerne ein wenig funktionale Programmierung und Blick auf Toolz. Die Unterschiede zwischen compose, pipe, thread_first und thread_last erscheinen mir sehr subtil oder nicht existent. Was sind die verschiedenen Anwendungsfälle für diese Funktionen?Verständnis toolz Use Cases
Antwort
compose
vs.thread_*
undpipe
compose
ist ein im Wesentlichen ein function compostion (∘). Es ist das Hauptziel, verschiedene Funktionen in wiederverwendbare Blöcke zu kombinieren. Reihenfolge der Anwendungen ist umgekehrt im Vergleich zu der Reihenfolge der Argumente, socompose(f, g, h)(x)
istf(g(h(x)))
(das gleiche wie (f ∘ g) (x) ist f (g (x))).thread_*
undpipe
sind über wiederverwendbare Blöcke, um einen einzelnen Datenfluss zu erstellen. Die Ausführung kann nur mit verzögerten Operationen verzögert werden, Blöcke sind jedoch behoben. Reihenfolge der Anwendung ist die gleiche wie Reihenfolge der Argumente, sopipe(x, f, g, h)
isth(g(f(x)))
.compose
vsthread_*
.compose
ermöglicht keine zusätzlichen Argumente, währendthread_*
tut. Ohne curryingcompose
kann nur mit unären Funktionen verwendet werden.Im Vergleich zu diesen
thread_
kann mit Funktionen höherer arity verwendet werden, einschließlich häufig verwendeter Funktionen höherer Ordnung:thread_last( range(10), (map, lambda x: x + 1), (filter, lambda x: x % 2 == 0) )
Um die gleichen Sache mit
compose
müssen Sie currying:pipe( range(10), lambda xs: map(lambda x: x + 1, xs), lambda xs: filter(lambda x: x % 2 == 0, xs) )
oder
from toolz import curried pipe( range(10), curried.map(lambda x: x + 1), curried.filter(lambda x: x % 2 == 0) )
thread_first
vs.thread_last
.thread_first
setzt pipeed Argument an der ersten Position für die Funktion.thread_last
setzt pipeed Argument an der letzten Position für die Funktion.Zum Beispiel
>>> from operator import pow >>> thread_last(3, (pow, 2)) # pow(2, 3) 8 >>> thread_first(3, (pow, 2)) # pow(3, 2) 9
In der Praxis (einige Formalismus ignoriert wird) diese Funktionen typischerweise untereinander austauschbar sind, vor allem, wenn sie mit functools.partial
/toolz.curry
und einigen lambda
Ausdrücke kombiniert, aber je nach Kontext, ist es einfach bequemer übereinander zu verwenden.
Zum Beispiel mit eingebauten Funktionen höherer Ordnung, wie map
oder functools.reduce
, thread_last
ist eine natürliche Wahl. Wenn Sie ein Stück Code an mehreren Stellen wiederverwenden möchten, verwenden Sie besser compose(h, g, f)
als das Hinzufügen des Funktionswrappers def fgh(x) pipe(x, f, g, h)
. Und so weiter.
- 1. iBeacon Implementierung - Use Cases
- 2. Use Cases of NIFI
- 3. Virtuelle destructor Use Cases
- 4. ! Operator in Javascript - Use Cases
- 5. DRY Rails Metaprogrammierung - Use Cases
- 6. Java enums Wandelbarkeit Use Cases und Möglichkeiten?
- 7. Algolia Tags vs Facetten Use Cases
- 8. Beispiele/Use-Cases zum Erstellen einer eigenen ControllerFactory?
- 9. Wie beweisen Sie Kollegen, dass Use Cases wichtig sind?
- 10. Use-Liste Verständnis statt Schleife in Python
- 11. UML 2.0 Kann ich eine bidirektionale Extend-Beziehung zwischen Use Cases haben?
- 12. Zusammenfassen von switch statement cases?
- 13. Primzahl Generieren Puzzle (Edge Cases)
- 14. USE-CASE - Wie schreibt man ein Use-Case-Diagramm in einem Mehrbenutzersystem?
- 15. Verständnis Testsuites
- 16. Wie gruppieren wir Aggregate für verschiedene Match Cases?
- 17. Parsing CSS mit ANTLR - Edge Cases
- 18. Wie kann ich Switch-Cases optimieren?
- 19. F # und statisch geprüfte Union Cases
- 20. Umgang mit Switch Cases in Meteor Templates
- 21. Camel-Cases Foreign Key Name in Schienen
- 22. Corner Cases, Unerwartete und Ungewöhnliche MATLAB
- 23. jmeter Gewinde und rampup Verständnis
- 24. Verständnis
- 25. Warum wird gesagt "Collaboration" realisiert "Use Case" statt umgekehrt?
- 26. ThreadPool.QueueUserWorkItem Use Case
- 27. "Global Use" In C#
- 28. Use "" in extended_valid_elements TinyMCE
- 29. „use strict“ in Javascript
- 30. jshint "use strict" -Ausgabe