【发布时间】:2012-05-24 18:22:28
【问题描述】:
以下是我就餐哲学家的代码并产生一个编译错误,指出“'do' 构造中的最后一条语句必须是一个表达式:mVar2
import Control.Concurrent
import Control.Concurrent.MVar
import System.Random
takefork :: Int -> forks -> IO ()
takefork n forks = takeMVar (forks!!n)
releasefork :: Int -> forks -> IO ()
releasefork n forks = putMVar (forks!!n)
philosopher :: [Int]
philosopher = [1,2,3,4,5]
forks :: [MVar] -> [Int]
forks = do
takefork n ( philosopher - 1)
threadDelay delay
let delay = 100000
takefork n philosopher
putStrLn("Philosopher" ++ philosopher ++ "has started eating")
releasefork n philosopher
releasefork n ( philosopher - 1)
ptStrLn ("Philosopher" ++ philosopher ++ "has stopped eating")
forks
main :: IO ()
main = do
mVar1 <- newEmptyMVar
mVar2 <- newEmptyMVar
mVar3 <- newEmptyMVar
mVar4 <- newEmptyMVar
mVar5 <- newEmptyMVar
let mVar = [mVar1, mVar2, mVar3, mVar4, mVar5]
sequence_ [ forkIO forks (mVar philosopher) ]
【问题讨论】:
-
由于许多可能与您的问题无关的原因,这无法编译,您能解决它们吗? (例如,“
16:14: Not in scope: 'n'”) -
它在范围内。我不明白为什么它不适合你。
-
好吧,不是的!
n需要被定义为全局变量或作为forks的函数参数,两者都不是。这不是唯一的问题。 — 请务必复制您所询问的程序完全正确。 -
嗯,我不明白为什么会这样。在我的程序中,我所做的只是调用我在 forks 中定义的函数,并使其成为递归函数。我觉得我的主要问题是在实现 main 时出现的。
-
takefork n ( philosopher - 1)行中,n是从哪里来的?它没有在任何地方声明。此外,您将philosopher视为一个数字,但事实并非如此。代码还有很多其他问题。
标签: haskell dining-philosopher