7

Üretici/tüketiciyi Haskell gibi fonksiyonel bir programlama dilinde nasıl uygulayabiliriz? ve bir Imperative dilinden nasıl farklı olacak? Fonksiyonel programlama dilini anlamam ilkeldir. Herhangi bir yardım takdir edilecektir. Bir kanal boyunca geçen önleyici konuları ve mesajları kullanarakHaskell'de üretici ve tüketici sorunu mu var?

+0

Bu, http://stackoverflow.com/questions/1234947/can-producer-consumer-problem-be-solved-without-using-assignment adresine çok yakındır. Orada sunulan çözümleri kontrol ettiniz mi? – nlucaroni

cevap

14

bir üretici/tüketici soyutlama:

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 

için Erlang benzer bir model kullanmak. Tüketici ve yapımcıyı temsil eden iplikler ve bunların her biri eşzamansız olarak hareket eden paylaşılan bir mesajlar borusu.

+2

Bu yanıt, bu sorunu nasıl zorunlu olarak çözebileceğini açıklar. Ya da daha kesin olarak, problemi çözen işlevsel bir hesaplamanın işlevsel olarak nasıl üretileceği. Şiva'nın tamamen işlevsel bir çözüm aradığını merak ediyorum. Bununla birlikte, Python jeneratörlerinde – Conal

6

dons'un mükemmel yanıtına, buradaki temel mekanizmanın, MVar adı verilen bir şey olduğunu ve bir değer için zorunlu, paralel bir kapsayıcı olduğunu ekleyeceğim. MVar'ın içine ve dışına "koyarsın" ve "çıkar". Boş bir MVar bloğu almak, tam bir tane gibi. Aynı anda bir iletişim mekanizması ve bir senkronizasyon mekanizması. Monsoon/* t projesinin bir parçası olarak Arvind tarafından icat edildiğine inanıyorum. Paralel Haskell'in pH diyalektlerini açıklayan güzel bir book by Nikhil and Arvind var. Fikirlerin çoğu GHC'ye kabul edildi ve kitap okumaya değer.

2

Norman ve Don tarafından belirtilen durumsal yaklaşımların yanı sıra, normal işlev uygulaması ve tembelliği üretici ve tüketici olarak da düşünebilirsiniz. İşte

doğal sayılar için bir üreticidir:

nats = [1..] 

Ve burada bu sayıların karelerini hesaplayan bir tüketici Python'da

squares = map (\x -> x * x) nats 

böyle yield return olarak C# Üreticileri veya jeneratörler genellikle şöyle ifade edilebilir: Haskell'deki basit tembel listeler.

+0

'un yan etkileri olabilir (saf listelerin aksine). bunu da monadik listelerle yapabilirsiniz ve ayrıca Jeneratörün Jeneratör Mono transformatörüyle "paket" gibi üretkenleri üretebilirsiniz. – yairchu

İlgili konular