首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell就业池

Haskell就业池
EN

Stack Overflow用户
提问于 2017-03-04 16:10:02
回答 1查看 179关注 0票数 2

我对Haskell编程很感兴趣,但我想创建一个作业池系统,我想知道这是否会成为Haskell的一个问题。

下面是Ruby中的一个简单程序。在执行的一个线程上,从用户那里获取单词并添加到列表中。在另一个线程上,单词从列表中取出并以某种方式处理(在这种情况下,反转并打印给用户)。

代码语言:javascript
复制
words = []

# Create new thread to take words from array, one at a time, and process them
t = Thread.new {
  loop do
    unless words.empty?
      word = words.pop
      break if word == 'quit'
      sleep 1
      puts word.reverse
    end
  end
}

# Take words from user and add to array
loop do
  puts "Enter word:"
  word = gets.chomp
  words << word
  break if word == 'quit'
end

t.join

什么是等效的Haskell代码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-04 16:37:50

这是一个非常接近的翻译。

Chan是一个FIFO队列,用于Haskell线程之间的消息传递。

下面我使用一个MVar来等待假脱机程序退出。这就像一个常规的可变变量,但它是由互斥保护的。它可以是空的(只允许一个puttake的等待),也可以是满的(只允许一个takeput的等待)。

我还使用了下面的Haskell线程,这些线程可能运行在单独的OS级线程上,也可能不是Haskell运行时选择的。与OS线程相比,Haskell线程非常便宜。

有关更多讨论,请参见真实世界Haskell

代码语言:javascript
复制
{-# OPTIONS -Wall #-}
module JobPool where

import Control.Monad (when)
import Control.Concurrent

spooler :: Chan String -> MVar () -> IO ()
spooler ch stop = do
   word <- readChan ch
   if word == "quit"
   then putMVar stop ()
   else do
      threadDelay 1000000 -- us
      putStrLn (reverse word)
      spooler ch stop

main :: IO ()
main = do
   stop <- newEmptyMVar
   ch <- newChan
   _ <- forkIO $ spooler ch stop
   let loop = do
          word <- getLine
          writeChan ch word
          when (word /= "quit") loop
   loop
   takeMVar stop
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42598146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档