我最近开始阅读Go编程语言,我发现通道变量是一个非常吸引人的概念.是否有可能在Haskell中效仿同样的概念?可能具有数据类型Channel a
和一元 struct ,以实现像关键字go
一样工作的可变状态和功能.
我不太擅长并发编程,在Haskell中,一个简单的通道传递机制会让我的生活更轻松.
EDIT个
人们要求我澄清我有兴趣将哪种围棋模式翻译给哈斯克尔.所以GO有一流的通道变量,可以由函数传递和返回.我可以读取和写入这些通道,因此可以在可以并发运行的 routine 之间轻松通信.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)
}
我的主要兴趣是进行蒙特卡罗模拟,在模拟中,我通过try 修改系统的当前状态,并在满足某些标准的情况下接受修改,从而按顺序生成配置.
事实上,使用这些通道的东西,我可以编写一个非常简单、可读性强的小型蒙特卡罗模拟,在我的多核处理器中并行运行,这给我留下了深刻的印象.
问题是Go有一些局限性(特别是它缺乏多态性,这是我在Haskell中习惯的方式),除此之外,我真的很喜欢Haskell,不想放弃它.所以问题是,是否有某种方法可以使用类似于上面代码的机制,轻松地在Haskell中进行并发模拟.
EDIT(2, context):
我从来没有听说过单独的圆周率演算或CSP频道.如果这个问题看起来不合适,很抱歉,这可能是我对这件事的极度无知的错.
你是对的,我应该更具体地说明我想在Haskell中复制Go中的哪种模式,我将try 编辑这个问题,使其更具体.但不要期待深刻的理论问题.问题是,从我阅读和编写的几篇文章来看,Go似乎有一种简洁的并发方式(在我的例子中,这意味着我的工作就是让所有的内核都能轻松地进行数值计算),如果我能在Haskell中使用类似的语法,我会很高兴.