2010-11-03 23 views
32

Une question rapide, Y at-il un opérateur dans Haskell qui fonctionne comme le signe du dollar, mais donne la priorité au côté gauche. C'EST À DIRE. au lieu de

f (x 1) 

en cours d'écriture comme

f $ x 1 

Je voudrais écrire comme

x 1 $ f 

Ceci est purement une chose stylistique. Je cours une séquence de fonctions dans l'ordre et ce serait bien si je pouvais les écrire à gauche pour écrire pour correspondre à ce que j'ai lu à gauche pour écrire. S'il y a un opérateur pour ça?

[mise à jour] Quelques personnes m'ont demandé si je ne pouvais pas définir la mienne. En réponse, je voulais vérifier s'il n'y avait pas d'opérateur avant de réinventer la roue.

+4

Cette est comme l'opérateur de composition de pipeline de F #. Discussion connexe (sur pourquoi il n'est pas intégré dans Haskell): http://stackoverflow.com/questions/1457140/haskell-composition-vs-fs-pipe-forward-operator –

+0

Il semble que la réponse à ma question soit "non" .Merci :) –

+2

Vous réalisez que vous combinez l'application de gauche à droite et de droite à gauche dans la même expression, n'est-ce pas? La plupart des gens, je pense, se plaindre de cela. L'application inverse est ce qu'on appelle le T-combinateur. Il était souvent noté (#) il y a quelques années, mais maintenant # est un symbole spécial dans GHC, donc il n'est plus beaucoup utilisé. –

Répondre

19

Je ne sais pas s'il existe un opérateur standard, mais qu'est-ce qui vous empêche d'écrire le vôtre? Cela fonctionne dans ghci:

Prelude> let a $> b = b a 
Prelude> 1 $> (+2) 
3 
Prelude> sum [1, 2] $> (+2) 
5 
Prelude> map (+2) [1, 2] $> map (+3) 
[6,7] 

MISE À JOUR: recherche sur Hoogle pour a -> (a -> b) -> b (il est le type de cet opérateur) rien trouvé utile.

+4

On dirait que je vais l'utiliser, merci. Un £ me plaît pour l'opérateur. –

+5

@Benjamin Confino: Les jeux de mots sont toujours agréables, mais pour un usage réel, je suggère de considérer '|>'. Comme indiqué ci-dessus, cet opérateur dans F # fait exactement ce que vous cherchez, donc en utilisant le même nom aidera les gens à comprendre votre code plus facilement. –

+2

C'est l'un des atouts réels de Haskell que vous pouvez écrire vos propres opérateurs de flux de contrôle. Haskell n'a pas de construction "en boucle"? Aucun problème! Il suffit d'écrire le vôtre. –

-1

Vous ne pouvez pas simplement redéfinir $.

let ($) x f = f x 

Ou tout simplement choisir un autre opérateur, comme $$

+3

Redéfinir un opérateur standard n'est pas une bonne idée du tout. – michau

4

Je ne suis pas au courant d'une version standard, mais j'ai vu (#) utilisé à cette fin dans quelques endroits. L'un en particulier qui vient à l'esprit est HOC, qui l'utilise dans un idiome comme:

someObject # someMessage param1 param2 

Je me souviens avoir vu d'autres bibliothèques « orientées objet » à l'aide de l'opérateur # de la même manière, mais ne se souvient pas combien ou lesquels.

+2

Wash uses (#). Erik Meijer, Daan Leijen et James Hook l'ont utilisé pour scripter MS Agent avec Active Haskell (un pont Haskell-COM). Peut-être que le pont initial Haskell/ObjectiveC a également utilisé (#). –

10

Ce combinateur est défini (langue dans la joue) dans le paquet data-aviary:

Prelude Data.Aviary.BirdsInter> 1 `thrush` (+2) 
Loading package data-aviary-0.2.3 ... linking ... done. 
3 

Bien que l'utilisation fait ce paquet est une chose assez stupide à faire, la lecture de la source est amusant, et révèle que this combinator est formé via l'incantation magique de flip id (ou, en langage ornithologique, cardinal idiot).

+4

'' caridinalIdiot'' est un magnifique nom de combinateur! – sclv

24

Dans Haskell, vous pouvez utiliser flip pour modifier l'ordre des arguments d'une fonction binaire ou opérateur:

ghci> let (|>) = flip ($) 
ghci> 3 |> (+4) |> (*6) 
42 
+0

Solution très lisse! –