Haskell Monade lier opérateur de confusion

Ok, donc je ne suis pas un Haskell programmeur, mais je suis absolument fascinée par beaucoup d'idées derrière Haskell et suis à la recherche dans l'apprentissage. Mais je suis coincé à la case départ: je n'arrive pas à envelopper ma tête autour de Monades, qui semblent être assez fondamental. Je sais qu'il y a un million de questions sur DONC demandant d'expliquer les Monades, donc je vais être un peu plus précis sur ce qui m'énerve:

J'ai lu cet excellent article (une introduction à Javascript), et de la pensée que j'ai compris Monades complètement. Puis j'ai lu l'article de Wikipédia sur les Monades, et vu ce:

Une opération de liaison de type polymorphe (M, t)→(t→M u)→(M, u), qui Haskell représente par l'opérateur infixe >>=. Son premier argument est une valeur dans un type monadique, son second argument est une fonction qui cartes du type sous-jacent du premier argument à un autre type monadique, et son résultat est dans cet autre type monadique.

Bon, dans l'article que je cite, de se lier a une fonction qui s' un seul argument. Wikipédia dit que deux. Ce que je pensée j'ai compris sur les Monades était la suivante:

  1. Une Monade but est de prendre une fonction avec des entrées et des types de sortie et de le rendre modulable. Il le fait en les enveloppant l'entrée et la sortie des types avec un seul type monadique.
  2. Une Monade se compose de deux fonctions interdépendantes: bind et de l'unité. Lier prend un non-composable fonction f et retourne une nouvelle fonction g qui accepte les monadique type en entrée et renvoie le type monadique. g est modulable. L'unité de la fonction prend un argument de type f prévu, et l'enveloppe dans le type monadique. Cela peut ensuite être transmis à g, ou à toute composition de fonctions comme le g.

Mais il doit y avoir quelque chose de mal, parce que mon concept de bind prend un argument: une fonction. Mais (selon Wikipedia) Haskell lier prend réellement deux arguments! Où est mon erreur?

  • Pensez à ce qui arrive si vous inversez l'ordre des arguments de >>= et de le traiter comme un curry de fonction. =<< prend une fonction f, et retourne une fonction (f =<<) qui prend monadique de la valeur...
  • Les monades ne sont pas fondamentaux.
  • n'est-ce pas plus une application partielle plutôt que de nourrissage?
  • nourrissage est le nom de la transformation qui permet à une application partielle. Ils sont la même chose. En Haskell il est d'usage d'écrire les fonctions de plusieurs arguments dans le curry de forme, de sorte que vous n'avez pas l'habitude de l'avis de cette équivalence.
  • Les monades sont plus comme des carrés de 14 (Real World Haskell, chapitre 14 book.realworldhaskell.org/read)
  • le "bind" de l'option Javascript de votre article est =<<, qui a le type (a -> m b) -> (m a -> m b), il est en effet de transformer un "non-composable" a -> m b fonction dans un "modulable" m a -> m b fonction. Nous pouvons dire que les Monades sont sur le "généralisée" de la fonction de demande (m a -> m b v réguliers a -> b). Bien sûr, il sont des Foncteurs (fmap fait m a -> m b fonctions de trop) et les Foncteurs Applicatifs (<*> fait la même chose).
  • Mais les trois diffèrent en ce qu'ils créent ces "composable monadique fonctions" de. ---- "Cela peut ensuite être transmis à g" de ne pas g, mais à bind f: bind f (unit a) = f a. Ou en Haskell f =<< return a = return a >>= f = f a. g s'attend à ce que le type f a produit.

InformationsquelleAutor Ord | 2011-11-02