我最近开始阅读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中使用类似的语法,我会很高兴.

推荐答案

我想你要找的是基地Control.Concurrent.Chan号.我没有发现它与Go的Chans有什么不同,除了明显的haskelLife.频道并不是什么特别的东西,看看wiki page about it.

通道是称为communicating sequential processes (CSP)的更一般概念的一部分,如果您想在Haskell中进行CSP风格的编程,您可能会想看看Communicating Haskell Processes (CHP)包.

CHP只是Haskell实现并发性的一种方法,更多信息请查看Haskellwiki concurrency page.我认为你的用例最好用Data Parrallel Haskell来编写,不过这是目前正在进行的工作,所以你现在可能想用别的东西.

Go相关问答推荐

为什么我不能使用Docker从本地访问我的Gin应用程序?

Golang Viper:如果第一个字段不存在,如何从另一个字段获取值

使用ciph.AEAD.Seal()查看内存使用情况

减少在围棋中映射DTO时的重复代码量

使用Golang的Lambda自定义al2运行时,初始化阶段超时

Redis:尽管数据存在,但 rdb.Pipelined 中出现redis:nil错误

Golang:访问any类型泛型上的字段

无法在go中为docker容器写入有效的挂载路径

gopacket:IP-in-IP 数据包上的解码层

Golang 创建一个带有处理程序的模拟数据库并使用接口调用数据库

如何使用名称具有包名称的嵌套 struct 启动 go struct

fmt.Printf() 标志 '0' 不会被字符串忽略

每次有人进入我的网站时如何运行特定功能?

Gorm 在保存/创建时序列化 struct

如何在 Windows 上使用 cgo 为 386 arch 构建 lib?

如何从 Go 1.18 中的单个方法返回两种不同的具体类型?

使用 Go 读取 TOML 文件时结果为空

出于某种原因,Golang (Go) AES CBC 密文被填充了 16 个 0x00 字节

将函数的值作为输入参数返回给另一个

linter err113: do not define dynamic errors, use wrapped static errors instead