Je ne suis pas intéressé dans la première définition, de ces allait pas m'aider à écrire un vrai programme (+1 si vous me convaincre que j'ai tort). S'il vous plaît aidez-moi à comprendre la deuxième définition. Je pense que la carte, de filtre et de réduire sont utiles: elles me permettent de m'programme à un niveau supérieur -- moins d'erreurs, plus court et plus clair de code.
Les deux définitions sont fondamentalement la même chose. La première est basée sur la définition formelle et les exemples que vous donnez sont primitifs combinators--les plus petits blocs de construction possible. Ils peuvent vous aider à rédiger un véritable programme dans la mesure où, avec eux, vous pouvez créer plus sophistiquées combinators. Pensez à combinators comme S et K comme le langage machine d'un hypothétique "combinatoire de l'ordinateur". De vrais ordinateurs ne fonctionnent pas de cette façon, bien sûr, de sorte que, dans la pratique, vous aurez généralement de niveau supérieur, les opérations mises en œuvre en coulisses dans d'autres façons, mais le fondement conceptuel est encore un outil utile pour comprendre le sens de ceux de niveau supérieur opérations.
La deuxième définition que vous donnez est plus informel et sur l'utilisation plus sophistiquée combinators, sous la forme de fonctions d'ordre supérieur qui se combinent à d'autres fonctions dans diverses manières. Notez que si les blocs de construction de base sont les primitives combinators ci-dessus, le tout construit à partir d'eux est une fonction d'ordre supérieur et un combinateur. Dans une langue où d'autres primitives existent, cependant, vous avez une distinction entre les choses qui sont ou ne sont pas des fonctions, auquel cas un combinator est généralement définie comme une fonction qui manipule les autres fonctions d'une manière générale, plutôt que de fonctionner sur n'importe quelle fonction les choses directement.
Ce sont d'autres exemples de combinators comme la carte, le filtre?
Beaucoup trop nombreuses pour les énumérer! Ces deux transformer une fonction qui décrit le comportement d'une seule valeur dans une fonction qui décrit le comportement d'ensemble de la collection. Vous pouvez également avoir des fonctions qui transforment seulement d'autres fonctions, telles que la composition de bout en bout, ou du fractionnement et de la recombinaison des arguments. Vous pouvez avoir combinators que tourner en une seule étape des opérations dans les opérations récursives qui produisent ou consomment des collections. Ou toutes sortes d'autres choses, vraiment.
Ce combinators faire langages de programmation souvent mettre en œuvre?
Qui va varier un peu. Il y a relativement peu de complètement générique combinators--surtout la primitive ceux mentionnés ci-dessus-dans la plupart des cas combinators aura une certaine prise de conscience de toutes les structures de données utilisées (même si ces structures de données sont construites à partir d'autres combinators de toute façon), auquel cas il y a généralement une poignée de "totalement générique" combinators et alors, quelles que soient différents les formes spécialisées quelqu'un a décidé de fournir. Il y a un nombre ridicule de cas où (suffisamment généralisée versions de la carte), plier et déplier sont assez pour faire presque tout ce que vous voudrez peut-être.
Comment peut-combinators m'aider à concevoir une meilleure API?
Exactement comme vous l'avez dit, en pensant en termes d'opérations de haut niveau, et de la même manière que les personnes interagissent, au lieu de les détails de bas niveau.
Penser à la popularité de "pour chaque style"passe en boucle sur les collections, qui vous permettent de résumé sur les détails de l'énumération d'une collection. Ce sont juste des carte/fold opérations dans la plupart des cas, et en faisant un combinateur (plutôt que de la syntaxe), vous pouvez faire des choses comme prendre deux boucles et directement les combiner de multiples façons--imbriquer l'un dans l'autre, l'un après l'autre, et ainsi de suite--par simple application d'un combinator, plutôt que de jongler avec un tas de code autour de.
Comment puis-je concevoir efficace combinators?
Tout d'abord, pensez à ce que les opérations de sens sur toutes les données de votre programme. Alors pensez à la façon dont ces opérations peuvent être utilement combinées dans des méthodes génériques, ainsi que la manière dont les opérations peuvent être divisés en plus petits morceaux qui sont connectées ensemble. La chose principale est de travailler avec des transformations et des opérations, et non pas directement des actions. Lorsque vous avez une fonction qui fait un peu compliqué les fonctionnalités de manière opaque et seulement crache une sorte de pré-digéré conséquent, il n'ya pas beaucoup que vous pouvez faire avec cela. Laisser les résultats définitifs pour le code qui utilise les combinators--vous voulez que les choses que vous emmener d'Un point a à un point B, pas des choses qui s'attendent à être le début ou la fin d'un processus.
Quelles sont les combinators semblable à un non-langage fonctionnel (par exemple, Java), ou que faire de ces langues utilisent à la place de combinators?
Ahahahaha. C'est drôle que vous demandez, parce que les objets sont vraiment de l'ordre supérieur des bidules en premier lieu, ils ont certaines données, mais ils ont également transporter un tas d'opérations, et beaucoup de ce qui constitue une bonne programmation orientée objet design se résume à "les objets doivent généralement agir comme combinators, pas de structures de données".
C'est probablement la meilleure réponse est qu'au lieu de combinateur-comme des choses, ils utilisent des classes avec beaucoup de getter et setter ou des champs publics, et la logique qui consiste essentiellement à faire quelques opaque, action prédéfinie.