Je voudrais comment pouvons-nous mettre en œuvre un producteur / consommateur dans un langage de programmation fonctionnel comme Haskell? Et comment cela sera différent d'une langue impérative? Ma compréhension du langage de programmation fonctionnel est primitive. Toute aide sera appréciée. P>
3 Réponses :
Abstraction de producteur / consommateur utilisant des threads et des messages préventifs passés à travers une chaîne:
import Data.Char
import Control.Concurrent
import Control.Concurrent.Chan
main = do
c <- newChan
cs <- getChanContents c -- a lazy stream of events from eventReader
forkIO (producer c) -- char producer
consumer cs
where
-- thread one: the event producer
producer c = forever $ do
key <- getChar
writeChan c key
-- thread two: the lazy consumer
consumer = mapM_ print . map shift
where shift c | isAlpha c = chr (ord c + 1)
| otherwise = c
Cette réponse décrit comment on pourrait résoudre ce problème impérativement. Ou plus précisément, comment générer fonctionnellement un calcul impératif qui résout le problème. Je me demande si Shiva cherchait une solution purement fonctionnelle.
J'ajouterai à Dons CODE> SON EXCELLENT REPONSE QUE LE MÉCANISME SOUS-JOINT ICI QUOI N'AI UNE QUELQUE CHOSE D'APPELER UNE MVAR CODE>, et c'est un conteneur impératif et parallèle pour une valeur. Vous "mettre" et "get" entrer et sortir d'un mvar. Obtenir des blocs MVAR vides, comme cela mettait un complet. C'est simultanément un mécanisme de communication et un mécanisme de synchronisation. Je crois qu'il a été inventé par Arvind dans le cadre du projet Monsoon / * T. Il y a une belle Réservez par Nikhil et Arvind qui explique leur dialecte de pH de Haskell parallèle. Beaucoup d'idées ont été adoptées en GHC et le livre vaut la peine d'être lu. P>
Outre les approches d'état mentionnées par Norman et Don, vous pouvez également penser à une application normale de fonction et à la paresse en tant que producteur et consommateur.
Voici un producteur pour les nombres naturels: P>
squares = map (\x -> x * x) nats
Cependant, dans les générateurs Python peuvent avoir des effets secondaires (contrairement aux listes pures). Vous pouvez également atteindre cela aussi avec des listes monadiques et vous pouvez également les générer avec un "rendement" comme en Python avec le transformateur Generatort Monad de l'emballage générateur.
Ceci est très proche de Stackoverflow.com/Questtions/1234947/... . Avez-vous vérifié les solutions présentées là-bas?