2016-02-10 1 views
0

Est-ce que le code suivant le droit de penser à currying dans Haskell. Voici un exemple d'addition en haskellLe curry est-il implémenté en utilisant lambdas dans haskell?

f = \x -> \y -> x + y 

En général, est-ce que la réalisation est réalisée en utilisant des lamdbas dans la programmation fonctionnelle?

+1

Oui, Haskell 'fxy = ...' est défini pour signifier 'f = \ x -> \ y -> ...'. – augustss

+0

Pouvez-vous clarifier ce que vous demandez, exactement? – dfeuer

Répondre

5

Currying est:

En mathématiques et de l'informatique, corroyage est la technique de traduction de l'évaluation d'une fonction qui prend plusieurs arguments (ou un tuple d'arguments) dans l'évaluation d'une séquence de fonctions, chacune avec un seul argument. Il a été introduit par Gottlob Frege, développé par Moses Schönfinkel, et développé par Haskell Curry.

source Wikipedia

maintenant on pourrait dire que, dans Haskell il y a jamais plus d'un argument à une fonction (vous pouvez bien sûr avoir tuples - voir ci-dessous) - Dans un sens tous fonctions dans Haskell sont déjà carried (ou ne peut être défini de telle manière).

Bien sûr, il y a curry et uncurry - mais ceux-ci agissent sur tuples:

curry     :: ((a, b) -> c) -> a -> b -> c 
curry f x y    = f (x, y) 

et je pourrais faire valoir qu'un tuple est juste un argument aussi;)


Sur le plan conceptuel, vous avez bien sûr raison, comme l'ont souligné les augustes!

Mais malheureusement il y a des problèmes (see Monomorphism Restriction par exemple) où cette égalité ne tient pas (si vous n'ajoutez pas une signature de type):

add x y = x + y === add = \x -> \y -> x + y 
+0

L'égalité est très bonne avec la restriction de monomorphisme. Vous avez juste à donner les deux fonctions de type signatures. – amalloy

+0

@amalloy Je devrais probablement avoir mentionné ce oui - mais l'OP n'a pas et je voulais juste commenter le commentaire par augustss – Carsten