Comprendre ce code requiert deux compétences:
- distinction entre « définition », ce qui peut être infinie (comme l'ensemble des nombres naturels:
naturals = (1 : map '\n->n+1' naturals
), ou la liste des demandes traitées) et « réduction », qui est le processus de mapper des données réelles à ces définitions
- voyant la structure de cette application client-serveur: c'est juste une paire de processus qui se parlent: 'client-serveur' est un mauvais nom, vraiment: il aurait dû être appelé «wallace-gromit» ou «foo-bar», ou philosophes parlant ou autre, mais c'est symétrique: les deux parties sont des pairs.
Comme Jon déjà indiqué, la réduction fonctionne d'une manière paresseuse (alias « appel par le besoin »): take 2 naturals
ne serait pas d'abord évaluer l'ensemble complet de Naturals, mais juste prendre le premier et préfixer que pour take 1 (map '\n->n+1' naturals)
, ce qui réduirait à [1, (1 + 1)] = [1,2].
maintenant la structure de l'application client-serveur est ce (à mes yeux):
server
est un moyen de créer une liste de réponses sur une liste de requêtes en utilisant la fonction process
client
est un moyen de créer une requête basée sur une réponse et d'ajouter la réponse de cette requête à la liste des réponses.
Si vous regardez de près, vous voyez que les deux sont 'un moyen de créer x: xs sur y: ys'. Nous pourrions donc les appeler uniformément wallace
et gromit
.
Maintenant, il serait facile de comprendre si client
serait appelé avec juste une liste de réponses:
someresponses = wallace 0 [1,8,9] -- would reduce to 0,1,8,9
tworesponses = take 2 someresponses -- [0,1]
Si les réponses ne sont pas littéralement connues, mais produit par gromit
, on peut dire
gromitsfirstgrunt = 0
otherresponses = wallace gromitsfirstgrunt (gromit otherresponses)
twootherresponses = take 2 otherresponses -- reduces to [0, take 1 (wallace (gromit ((next 0):...))]
-- reduces to [0, take 1 (wallace (gromit (0:...)) ) ]
-- reduces to [0, take 1 (wallace (1: gromit (...) ) ) ]
-- reduces to [0, take 1 (1 : wallace (gromit (...) )) ]
-- reduces to [0, 1 ]
L'un des deux homologues doit "démarrer" la discussion, d'où la valeur initiale fournie à wallace
.Notez également le ~ devant le modèle de gromit
: cela indique à Haskell que le contenu de l'argument de liste n'a pas besoin d'être réduit - s'il voit que c'est une liste, c'est suffisant. Il y a un bon sujet dans un wikibook on Haskell (cherchez "Lazy Pattern Matching".)
** Merci !! ** C'est exactement ce dont j'avais besoin - évaluation vraiment fait d'une manière que je n'attendais pas –
damn dude .. meilleure explication jamais? –