Je me demande pourquoi la fonction attendue par le pli à gauche a une signature de type in Haskell, par exemple, je dois écrire Faites proportionnellement plus d'usages d'utilisation nécessitant la signature de type donnée au lieu de l'autre, ou existe-t-il d'autres décisions qui ont conduit à la conception qui se trouve à gauche dans HASKELLL et SCALA (et probablement beaucoup d'autres langues)? P > a -> b -> a code> au lieu de b -> a -> a code>. Y a-t-il une décision de conception derrière cela? P>
plipl (\ xs x -> x: xs) [] xs code> pour inverser une liste à la place du fichier plus court (:) [ ] XS code> (qui serait possible avec B -> A -> A code>). D'autre part, il existe des cas d'utilisation qui nécessitent la norme a -> b -> a code>. Dans Scala, cela pourrait être ajouté: xs.foltleft (list.empty [int]) ((xs, x) => xs: + x) code> qui peut être écrit comme xs.foldleft (List.empty [int]) (_: + _) code>. P>
4 Réponses :
parce que vous écrivez (a /: bs) code> pour repliolft code> sous forme abrégée; Ceci est un opérateur qui appuie A code> via tous les BS code>, il est donc naturel d'écrire la fonction de la même manière (c.-à-d. (A, B) => A code>). Notez que flambight code> est-ce dans l'autre ordre. P>
Nice, mais cela ne l'expliquera que pour Scala pas dans Haskell qui n'a pas /: code>.
Conceptuellement, un pli droit, dire avec la valeur d'une expression de la forme suivante p> Si nous devions représenter cette expression sur une seule ligne, toutes les parenthèses s'associeraient à droite, d'où le nom droit pli: si Nous devions écrire ce diagramme sur une seule ligne, nous obtiendrions une expression où toutes les parenthèses associent à gauche, qui se jibrent bien au nom d'un pli gauche: p> Mais remarquez que dans ce diagramme de miroir, le résultat récursif du pli est introduit à pli FZ [1..4] code> remplace une liste du formulaire suivant (1 `f` (2` f` (3 `f` (4` f` z)))) code>. Un pli gauche est double dans un sens à un pli droit. En particulier, nous aimerions que la forme du diagramme correspondant pour un pli gauche soit une image miroir de celle pour un pli gauche, comme dans les suivants: p> F code> comme premier argument, tandis que chaque élément de la liste est alimenté comme deuxième argument, c'est-à-dire que les arguments sont destinés à f code> dans l'ordre inverse par rapport aux plis droit. p> p>
La signature de type est Foldl :: (A -> B -> A) -> A -> [B] -> A code>; Il est naturel que la fonction de combinaison ait la valeur initiale à gauche, car c'est la façon dont il se combine avec les éléments de la liste. De même, vous remarquerez replier code> l'a l'inverse. La complication de votre définition de l'inverse est que vous utilisez une expression lambda où flip code> aurait été plus agréable: plipl (Flip (:)) [] xs code>, lequel a la similitude agréable entre les concepts de flip et d'inverse. p>
dire que vous avez ceci: c'est la même que: p> Voir comment le premier paramètre est toujours l'accumulateur? Avoir les paramètres de cette commande rend la syntaxe de plachalder (le soulignement) une traduction directe vers l'expression expansée. P> p>
En d'autres termes, vous devez inverser l'ordre d'argument de
(:) code> afin d'inverser une liste. A du sens pour moi.Notez que
mapaccuml code> etmapaccumr code> (à partir dedata.list code> /data.traverable code>) ont la même signature, bien qu'ils Travaillez aussi dans des directions opposées.