我对Haskell编程很感兴趣,但我想创建一个作业池系统,我想知道这是否会成为Haskell的一个问题。
下面是Ruby中的一个简单程序。在执行的一个线程上,从用户那里获取单词并添加到列表中。在另一个线程上,单词从列表中取出并以某种方式处理(在这种情况下,反转并打印给用户)。
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代码?
发布于 2017-03-04 16:37:50
这是一个非常接近的翻译。
Chan是一个FIFO队列,用于Haskell线程之间的消息传递。
下面我使用一个MVar来等待假脱机程序退出。这就像一个常规的可变变量,但它是由互斥保护的。它可以是空的(只允许一个put,take的等待),也可以是满的(只允许一个take,put的等待)。
我还使用了下面的Haskell线程,这些线程可能运行在单独的OS级线程上,也可能不是Haskell运行时选择的。与OS线程相比,Haskell线程非常便宜。
有关更多讨论,请参见真实世界Haskell。
{-# 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 stophttps://stackoverflow.com/questions/42598146
复制相似问题