7

Haskellのような関数型プログラミング言語でプロデューサ/コンシューマを実装するにはどうすればいいですか?命令言語とはどのように異なるのでしょうか?関数型プログラミング言語の私の理解は原始的です。どんな助けもありがとう。チャネルを通過したプリエンプティブスレッドとメッセージを使用してハスケルの生産者と消費者の問題?

+0

これはhttp://stackoverflow.com/questions/1234947/can-producer-consumer-problem-be-solved-without-using-assignmentに非常に近いです。そこにあるソリューションをチェックしましたか? – nlucaroni

答えて

14

プロデューサ/コンシューマ抽象化:

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 

あなたはErlangで同様のモデルを使用します。コンシューマとプロデューサを表すスレッド、およびそれらの間にメッセージの共有パイプがあり、それぞれ非同期的に動作します。

+2

この回答は、この問題をどのように解決するかについて説明しています。または、より正確には、問題を解決する命令的な計算を機能的に生成する方法です。 Shivaが純粋に機能的なソリューションを探しているのだろうかと思います。 – Conal

6

donsの根底にあるメカニズムはMVarと呼ばれ、値のための必須の並列コンテナです。あなたはMVarに出入りする "put"と "get"を行います。空のMVarを得ることは、完全なものを入れることと同じです。これは同時に通信メカニズムと同期メカニズムです。 Monsoon/* tプロジェクトの一環として、Arvindによって発明されたと思います。パラレルハスケルのpH方言を説明する美しいbook by Nikhil and Arvindがあります。アイデアの多くはGHCに採用されており、この本は読み解く価値があります。

2

ノーマンとドンで言及したステートフルなアプローチに加えて、あなたはまた、生産者と消費者としての正常な機能のアプリケーションと怠惰と考えることができます。ここ

は自然数のプロデューサーである:そのようなPythonでC#またはジェネレータでyield returnとして

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

プロデューサー:

nats = [1..] 

そしてここでは、これらの数字の二乗を計算し、消費者でありますハスケルの単純な遅延リストのように、しばしば以下のように表現することができます。

+0

しかし、Pythonジェネレータでは、(純粋なリストとは異なり)副作用があります。あなたもモナドリストを持つことを達成することができます。また、発電機パッケージからGeneratorTモナド変圧器とPythonでのような「歩留まり」とのそれらを生成することができます。 – yairchu

関連する問題