2014-09-15 5 views
5

J'essaie de comprendre la curry en lisant différents blogs et en empilant des réponses de flow over et je pense avoir compris quoi. Dans Haskell, chaque fonction est cari, cela signifie que, lorsque vous avez une fonction comme
f x y = x + y
il est vraiment
((f x) y)
dans ce domaine, la fonction d'abord prendre le premier paramètre « x » comme paramètre et applique partiellement à fonctionner f qui à son tour renvoie une fonction pour y. où il suffit d'un seul paramètre et applique la fonction. Dans les deux cas, la fonction ne prend qu'un seul paramètre et le processus de réduction d'une fonction pour prendre un seul paramètre s'appelle 'currying'. Corrigez-moi si ma compréhension est fausse ici.
Donc, si c'est correct, pourriez-vous s'il vous plaît me dire si les fonctions «deux» et «trois» sont des fonctions curry?
Le code suivant est-il réellement en cours de compilation?

three x y z = x + y + z 
two = three 1 
same = two 1 

Dans ce cas, j'ai deux fonctions spécialisées, « deux » et « même » qui sont réduits à prendre un seul paramètre est-il si cari?

+2

Vous pouvez le tester vous-même en utilisant la commande ': t' dans GHCi (': t three' affichera le type 'trois'). – Mephy

+0

super, je ne le savais pas. Merci. – Nair

+0

@JoshuaHannah - peut-être que vous voyez ça ici. Je sureley voulait dire aucune infraction ou pour vous de supprimer votre réponse - j'espérais juste que vous ajouteriez un peu d'informations utiles pour Nair - désolé homme – Carsten

Répondre

4

Regardons d'abord two. Il a une signature de

two :: Num a => a -> a -> a 

oublier le Num a pour l'instant (il est seulement une contrainte sur a - vous pouvez lire Int ici). Sûrement cela aussi est une fonction au curry.

Le prochain est plus intéressante:

same :: Num a => a -> a 

(BTW: joli nom - c'est le même mais pas exactement id ^^)

TBH: Je don Je ne sais pas à coup sûr.

La meilleure définition que je connaisse une fonction cari est la suivante:

Une fonction est une étrillé fonction des arguments N retournant une autre fonction d'arguments (N-1).

(si vous voulez vous pouvez mesure cela pleinement fonctions cari bien sûr)

Cela ne s'adapter si vous définissez des constantes comme fonctions avec 0 paramètres - que vous pouvez sûrement. Je dirais donc oui (?) Cela aussi est une fonction cari, mais seulement dans un mathy façon limite (comme la somme de 0 nombres est défini être 0)

1

On pourrait penser que three fonction avec des fonctions anonymes est:

three = \x -> (\y -> (\z -> x + y + z))) 
4

Meilleur simplement penser équationnellement.Les définitions suivantes sont toutes équivalentes:

f x  y  z = x+y+z 
f x  y = \z -> x+y+z 
f x = \y -> (\z -> x+y+z) 
f = \x -> (\y -> (\z -> x+y+z)) 

Une application partielle n'est ici pertinente que de manière tangentielle. Le plus souvent, vous ne voulez pas que l'application partielle réelle soit exécutée et que l'objet lambda réel soit créé en mémoire - en espérant que le compilateur l'utilisera - et optimise mieux - la définition complète au point final de l'application complète.

La présence des fonctions curry/uncurry est encore un autre problème prêtant à confusion. Les deux f (x,y) = ... et f x y = ... sont cari en Haskell, bien sûr, mais dans nos têtes nous avons tendance à pensent de la première en fonction de deux arguments, de sorte que les fonctions traduction entre les deux formes sont nommées curry et uncurry, comme mnémonique.

Questions connexes