最近、Goプログラミング言語について読み始めましたが、チャネル変数が非常に魅力的な概念であることがわかりました。Haskellで同じ概念をエミュレートすることは可能ですか?たぶんChannel a、キーワードのように機能する可変状態と機能を有効にするために、データ型とモナド構造を持っているでしょうgo。
私は並行プログラミングがあまり得意ではなく、Haskellのこのような単純なチャネル受け渡しメカニズムは私の人生を本当に楽にしてくれるでしょう。
編集
人々は私がHaskellに翻訳することに興味を持ったGoのパターンの種類を明確にするように私に頼みました。そのため、Goにはファーストクラスのチャネル変数があり、関数で受け渡しして返すことができます。これらのチャネルの読み取りと書き込みができるため、同時に実行できるルーチン間で簡単に通信できます。Goにはgoキーワードもあり、言語仕様に従って、独立したスレッドとして同時に関数の実行を開始し、待機せずにコードを実行し続けます。
私が興味を持っている正確なパターンは次のようなものです(Goの構文は奇妙です-変数は通常の逆の方法ではなくvarName varTypeによって宣言されます-しかし私はそれが読みやすいと思います):
func generateStep(ch chan int) {
//ch is a variable of type chan int, which is a channel that comunicate integers
for {
ch <- randomInteger() //just sends random integers in the channel
}
func filter(input, output chan int) {
state int
for {
step <- input //reads an int from the input channel
newstate := update(state, step) //update the variable with some update function
if criteria(newstate, state) {
state = newstate // if the newstate pass some criteria, accept the update
}
output <- state //pass it to the output channel
}
}
func main() {
intChan := make(chan int)
mcChan := make(chan int)
go generateStep(intChan) // execute the channels concurrently
go filter(intChan, mcChan)
for i:=0; i<numSteps; i++ {
x <- mcChan // get values from the filtered channel
accumulateStats(x) // calculate some statistics
}
printStatisticsAbout(x)
}
私の主な関心は、モンテカルロシミュレーションを実行することです。このシミュレーションでは、システムの現在の状態を変更しようとし、いくつかの基準を満たしている場合は変更を受け入れることで、構成を順番に生成します。
これらのチャネルのものを使用して、マルチコアプロセッサで並行して実行される非常にシンプルで読みやすく小さなモンテカルロシミュレーションを作成できたという事実は、私に本当に感銘を与えました。
問題は、Goにはいくつかの制限があることです(特に、Haskellで慣れている方法でポリモーフィズムが欠けています)。それに加えて、私はHaskellが本当に好きで、それを交換したくありません。したがって、問題は、上記のコードのようなメカニズムを使用して、Haskellで並行シミュレーションを簡単に実行する方法があるかどうかです。
EDIT(2、context): 私はコンピューターサイエンス、特に並行性については学んでいません。私は、CSとはまったく関係のない分野で、日常の研究ルーチンで単純な問題を解決するための単純なプログラムを作成するだけの人です。Haskellの仕組みが面白くて、それを使ってちょっとした雑用をするのが好きです。
パイ計算やCSPチャネルだけについて聞いたことはありません。質問が不適切に思われる場合は申し訳ありませんが、それはおそらく私の大きな無知のせいです。
そうです、私はGoのどのパターンをHaskellで複製したいかについてより具体的にする必要があります。そして、質問をより具体的に編集しようとします。しかし、深い理論的な質問を期待しないでください。問題は、私が読んでコーディングしたいくつかのことから、Goには並行性を実行するための優れた方法があるようです(私の場合、これは、すべてのコアを数値計算でハミングさせるという私の仕事が簡単であることを意味します)、そしてHaskellで同様の構文を使用できれば、嬉しいです。