你的代码有很多问题
您报告的错误信息显示您可能正在混合空格和制表符。 取消标签并只使用空格 。
您大概是在写这个程序, 以便练习写哈斯凯尔程序, 而不是为了娱乐和利润而运行这个程序。 因此我们不想简单地给你一个实用的迪宁哲学家执行, 我们想帮助您写入“ 您的'/ em'执行 ” 。
我无法从你的代码得知 你如何期望它的工作。
我要集中关注最后一行:
sequence_ [ forkIO forks (mVar philosopher) ]
sequence_ * [IOa] - & gt; IO ()
-- -- 给 sequence {/code> a list of i/o actions, 它( 返回一个 i/ o actions) 按顺序执行每个动作。 从 < code> <... > < < > < > < > < >
>, 看起来你正在尝试给它一个列表, 但只有一个元素。 这大概不是你想要的 。
forkio * IO () - & gt; IO ThreadID
-- -- 给 forkio
一种i/o动作,它(返回一个i/o动作) 开始i/o动作在一条新线索中运行, 给您该线索的代号 。
这里有两个问题:
forks
is a function, not an i/o action (it s not even a function that returns an i/o action, though you probably mean it to be)- you give
forkIO
a second argunment ((mVar philosopher)
), but it only takes one argument
mVar 哲学家
本身没有任何意义: mVar * [MVar a]
(这是MVar的列表,我还没有确定MVar应该包含什么类型),但你把它当作一个函数,通过 phicopher
作为参数。
此时, 灯泡会闪烁在我的头上。 您想要调用有参数 < code> mVar < / code > 和 < code > 哲学家 code > 的 < code > forks code > 吗?
sequence_ [ forkIO (forks mVar philosopher) ]
我们仍然在排序一个动作 。 您是否想要将 < code> forks code > 和 < code> phicopher code > 中的每个元素相依称为 < code > / code >?
sequence_ $ map (
-> forkIO (forks mVar n)) philosopher
我们可以简化到
mapM_ (
-> forkIO (forks mVar n)) philosopher
这与您给定的 forks * [MVar] - & gt; [Int]
类型不匹配。 但可能是错误的, 所以您会想要在下一个修正该函数 。