10
votes

Qu'appelons-nous cette fonction (nouvelle?) Plus haute commande?

J'essaie de nommer ce que je pense, c'est une nouvelle idée pour une fonction d'ordre supérieur. À la partie importante, voici le code de Python et Haskell pour démontrer le concept, qui sera expliqué ensuite.

python: p> xxx pré>

haskell: p>

Prelude> let pleat xs = zip xs (drop 1 xs)
Prelude> pleat [1..4]
[(1,2),(2,3),(3,4)]

Prelude> let pleatWith f xs = zipWith f xs (drop 1 xs)
Prelude> pleatWith (+) [1..4]
[3,5,7]


17 commentaires

Naturellement, cela devra être court. Alors charrue gagne là-bas. Ma question est de savoir s'il est assez important de mériter un nom. Quelles applications a-t-elle que nous l'utiliserions si souvent que nous n'utiliserions pas simplement le zip-linge unique?


Cette fonction est partielle et devrait probablement être laisser binaryprojection f xs = zipwith f (goutte 1 xs) xs . Le init est inutile étant donné l'utilisation de zip et la queue sera une erreur sur la liste vide où déposer 1 ne " t et fournit des résultats autrement correspondant.


Je ne sais pas s'il y a un nom pour cela, mais je sais que j'ai suivi ce modèle beaucoup. Je serais intéressé de savoir s'il avait un nom commun. J'appelle habituellement une «fusion» à cause de la façon dont vous fusionniez des valeurs ensemble.


@CHUCK VOSE: I (le compatriote mentionné ci-dessus) lui posa la même question! "Qu'est-ce que tu l'utilises?" Il a dit qu'il ne pouvait pas se souvenir. J'ai également construit pour lui une fonction de labour pouvant transmettre n'importe quel nombre de paramètres dans la fonction et qu'il a ensuite commencé à se demander à quel point ce principe est pratique.


En outre, parce que cette question est un peu subjective (surtout si elle n'a pas déjà de nom commun) peut-être que ce devrait être la communauté wiki?


@ROBERT MASSAIOLI: Je pense que la vraie question est si la fonction existe déjà et si nous pouvons le trouver en piratage ou autre.


@Shpeck: J'ai regardé dans les données.List et je ne pouvais rien voir. Vous pouvez également être sûr que la fonction a le type: (A -> A -> B) -> [a] -> [b] et cette fonction est très similaire à: haskell.org/hhc/docs/6.12.1/html/Libraries /base-4.2.0.0/...


@LSHPECK: un La recherche ne dit aucun pour les libs de base. Cela n'appartient vraiment pas aux libs de base qui voient que c'est si facilement recréé mais pas largement utilisé. Je voudrais également remettre en question la valeur de l'ajout d'une dépendance de paquet pour une telle petite fonction. En cas de piratage manquant ou liscituralement sont les deux endroits probables pour trouver une telle fonctionnalité, mais ce n'est pas là.


J'aime bien fusionner. Quelqu'un sait-il si ce nom est pris dans le monde de fonctionnement supérieur?


@Shpeck - Je sais que j'ai besoin de cette fonction quelques heures différentes. Je me souviens distinctement d'essayer de tracer ce comportement dans un pli et, évidemment, échouer.


@Legatou: La fusion est souvent utilisée pour fusionner deux listes de tri ensemble dans une liste triée (voir le paquet de liste, ou il pourrait être en manquant)


Si vous travailliez avec des flux au lieu de listes spécifiées, cela pourrait être défini à l'aide d'un déroulement ou d'analyse. Mais ce n'est pas ce que la personne recherche.


Je ne pense vraiment pas que cela devrait avoir un nom court - ce n'est pas assez utile pour cela, et cela prend des noms abrégés d'autres utilisations.


Arrêtez d'essayer de trouver de mignons petits mots à la mode que personne ne comprendra pour des opérations obscures et spéciales. Ne considérez même pas un nom générique comme «fusion». Utilisez une phrase descriptive, par exemple. appliquer_to_pairs .


Donc, j'ai posté ceci sur le Haskell Reddit et ils sont intelligents ( Reddit.com/ R / HASKELL / Commentaires / DHLSO / ... ): Laissez Meld f = carte (non-F). (Zip ap queue)


Une version python plus simple et donc plus lisible serait def labour (F, L): Remettre la carte (F, L [: - 1], L [1:])


Cela me rappelle CS.CMU.EDU/ Groupes / AI / HTML / HypersPec / HypersPec / Corps / ... . Peut-être que l'un de ceux-ci décrit ce que vous faites?


16 Réponses :


5
votes

Voici une autre implémentation pour Python qui fonctionne si l est un générateur aussi xxx

i pense apply_pairwise est un nom meilleur


1 commentaires

+.5 Pour le nom, +.5 pour la mise en œuvre.



6
votes

Comme il est similaire à "plier" mais ne réduit pas la liste en une seule valeur, que diriez-vous de "plisser"? Si vous continuez à "froncer", vous finissez par "plier" (sorte de).

Nous pourrions aller avec une métaphore de cuisine et l'appeler "pinch", comme pincer la croûte d'une tarte, bien que cela puisse suggérer une zippation circulaire, où le dernier élément de la liste est associé au premier. P>

def pinch(f, l):
    return map(lambda t: f(*t), zip(l, l[1:]+l[:1]))


3 commentaires

Vous pouvez faire un "INFINIPLOW" où vous pouvez réduire la séquence à une seule valeur en "labour" continuellement. J'ai appelé cette charrueduce jusqu'ici. Par exemple, une charrueduire chargerait une séquence [0..9] à la valeur 2304.


"La charrue" ne semble pas une bonne description, puisque les charrues se retournent, brisent les choses et aérer, dont aucune ne semble s'appliquer à ce que fait la fonction.


Je pense que Pinch est un excellent candidat!



1
votes

donc parce qu'il semble y avoir aucun nom pour cela, je suggère une "fusion" ou simple "fusionnée" parce que vous fusionnez des valeurs adjacentes ensemble.

SE SE Fusion est déjà prise, alors je suggère maintenant que je suggère maintenant "meld" (ou "fusion" encore mais qui peut être trop proche de "fusion")

par exemple: xxx

qui peut être utilisé comme étant : xxx

où le deuxième exemple ne fait aucun sens réel mais fait un exemple cool.


3 commentaires

Je favorise actuellement ce nom. Je pense que c'est suffisamment descriptif.


C'est bon mais des conflits avec fusion :: ord a => [a] -> [a] -> [a] qui fusionne deux listes triées dans une liste triée.


@TOMMD: Bon point, changeant à la fois "Meld". Il n'est pas pris, j'ai vérifié et c'est court et descriptif. "Juste, mélades cette liste avec la fonction (+)."



4
votes

Je ne vois vraiment pas de noms codifiés pour cela nulle part en python, c'est sûr. «Fusionner» est bon mais parlé dans une variété d'autres contextes. "La charrue" a tendance à être inutilisée et fournit un grand visuel de pousser régulièrement à travers une ligne de sol. Peut-être que je viens de passer trop de temps à jardiner.

J'ai également étendu le principe pour permettre aux fonctions qui reçoivent un nombre quelconque de paramètres.

Vous pourriez également envisager: pli. Il décrit bien la façon dont vous prenez une liste (comme un long brin de tissu) et des segments de blocage ensemble. xxx


1 commentaires

Mieux vaut utiliser itheroTools.stamap au lieu de Carte (Lambda P: F (* P) ​​...



2
votes

zipwithtail ou adjacentparaits .


0 commentaires

2
votes

Je vote pour salearwith ou Smudgewith car c'est comme si vous macez / maculés l'opération sur la liste.


0 commentaires

0
votes

Binaryopérat ou Bararinmerge


1 commentaires

Si vous allez confiner cela pour permettre uniquement des fonctions qui reçoivent deux paramètres, "DYADIC" serait un meilleur préfixe. Mais le principe ici, en utilisant des éléments dans une séquence en tant que paramètres, devrait, en théorie, étendre à plus de fonctions dyadiques.



6
votes

en python Le meld code> équivalent est dans les recettes ITERTOOLS et appelé paires par paires.

def pairwith(func, seq):
    return starmap(func, pairwise(seq))


0 commentaires

17
votes

hmm ... un contrepoint.

 zip`ap`tail


4 commentaires

Pourquoi n'est-ce pas? En tant que contre-points de contre-contre-contre-contre-points, Flip MapM , PlierR (>>) (Retour ()) (Retour ()) et LifeM2 ID été attribué certains. (NB Je ne discute pas que cela devrait, je souligne que l'argument est faible)


La carte et le pli sont les deux fonctions d'ordre supérieur fondamentales, par conséquent, utilisent comme celle-ci sont très courantes. La queue est modérément rare, Zip AP est extrêmement rare. rare + trivial == Pas une bonne raison de nommer.


Je ne savais pas de cela à ce sujet et je pense que d'autres personnes peuvent être dans le même bateau, quelle que soit la durée de l'utilisation de Haskell. Y a-t-il partout où passe un tas de ces extraits de code utiles, des choses qui ne sont pas aussi communes que le code de prélude, mais assez commun pour faire ces postes? Ou la plupart des gens trébuchent-ils sur cela eux-mêmes?


J'ai vu cette fonction d'ordre supérieur utilisé cesse souvent par des étudiants diplômés scientifiques. Principalement dans Matlab et Mathematica et une ou deux fois à Python. La connaissance de celui-ci a été transmise de qui jamais enseigné ou redécouvert.



1
votes

Utilisation de Mathematica

plus < Un href = "http://reference.wolfram.com/mathematica/ref/apply.html#1519920741" rel = "nfollow noreferrer"> @@@ partition [{0, 1, 2, 3}, 2, 1] ou l'une de ces autres alternatives verbeuses xxx

J'ai utilisé et apprécié cette fonction d'ordre supérieur dans de nombreuses langues, mais je l'ai le plus apprécié de Mathematica; Il semble succinct et flexible ventilé en partition et appliquer avec option NormePec.


1 commentaires

Je dois admettre que Haskell m'a remporté la plupart des jours 15 mois plus tard.



2
votes

Ceci semble être comme de Ruby's chaque_cons CODE>

ruby-1.9.2-p0 > (1..10).each_cons(2).to_a

=> [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10]] 


0 commentaires

2
votes

Cela me rappelle Convolution du traitement de l'image. Mais pas sûr si cela est correct mathématiquement.


3 commentaires

Dans les images de traitement d'image sont des fonctions représentées comme des tableaux. L'exemple 'Proprojection binaire (+) [0,1,2,3] est comme la convollement d'un noyau' [1,1] 'sur une image 1D (premiers coefficients qui se chevauchent multipliez que la somme). Bien que possible d'utiliser toute autre fonction que '+' rend la fonction d'ordre supérieur en question plus générale.


C'est une convolution d'une sorte. Les deux fonctions convolues sont F 1 = 1, F 2 = 1 et la fonction de nombres naturels à la liste d'entrée. L'opération binaire est spécifiée par l'argument de la fonction à labour ou meld ou quoi que ce soit appelé. Très similaire au sens DSP de convolution des signaux où la binop est (+).


@AaronMcsmooth, pas de problème. Comme @sfty Notes, il s'agit d'un hybride intéressant qui est principalement comme une convolution de signalisation, mais plus général en raison de la variable binop. Dans le sens le plus général de la convolution (plutôt que la version DSP restreinte), cette généralité supplémentaire n'est pas une difficulté. Quoi qu'il en soit, @sfty l'a remarqué; Je n'ai pas seul.



2
votes

La variante généralisée de la version zip ordinaire de ceci est ce que je penserais comme fenêtre . Pas chez un terminal GHCI en ce moment, mais je pense que fenêtre n = prise n. Tails . Ensuite, votre fonction est zipwith (\ [x, yj -> f x y). fenêtre 2 . Ce type de style fonctionne naturellement mieux lorsque F est de type [A] -> B .


0 commentaires

1
votes

Je serais tenté de l'appeler Contour comme je l'ai utilisé pour "contour" Traitement dans le logiciel de musique - au moment où je l'ai appelé Twomap ou quelque chose de stupide comme ça.

Il existe également deux «contours» nommés spécifiques dans le traitement de la musique, l'un est un contour brut - le terrain va-t-il monter ou descendre. L'autre est un contour raffiné où le contour est de haut en bas, de bas, de baisser ou de baisser, bien que je n'arrive pas à trouver une référence pour la grande différence de semi -one pour faire un saut.


0 commentaires

2
votes

Dans la bibliothèque de modèles standard C ++, elle s'appelle adjacent_difefence (bien que l'opérateur peut être n'importe quelle opération, pas seulement la soustraction)


0 commentaires

1
votes

Nice idiome! Je dois juste utiliser cela dans Perl pour déterminer le temps entre les événements séquentiels. Voici ce que j'ai fini avec.

sub pinch(&@) {
  my ( $f, @list ) = @_;
  no strict "refs";

  use vars qw( $a $b );

  my $caller = caller;
  local( *{$caller . "::a"} ) = \my $a;
  local( *{$caller . "::b"} ) = \my $b;

  my @res;
  for ( my $i = 0; $i < @list - 1; ++$i ) {
    $a = $list[$i];
    $b = $list[$i + 1];
    push( @res, $f->() );
  }
  wantarray ? @res : \@res;
}

print join( ",", pinch { $b - $a } qw( 1 2 3 4 5 6 7 ) ), $/;
# ==> 1,1,1,1,1,1


2 commentaires

Félicitations, Nécromancien;) Oh attendez ... Pour le badge Necromancer, vous avez besoin de +5 pour cette réponse ...


Ouais, Perl devient laid rapide, soupir!