8
votes

Producteur et problème de consommation à Haskell?

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.


1 commentaires

Ceci est très proche de Stackoverflow.com/Questtions/1234947/... . Avez-vous vérifié les solutions présentées là-bas?


3 Réponses :


14
votes

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


1 commentaires

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.



6
votes

J'ajouterai à Dons SON EXCELLENT REPONSE QUE LE MÉCANISME SOUS-JOINT ICI QUOI N'AI UNE QUELQUE CHOSE D'APPELER UNE MVAR , 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.


0 commentaires

2
votes

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


1 commentaires

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.