我对haskell真的很陌生,我正在尝试实现一个简单的connect4游戏,当我试图让玩家输入一个新动作时,我想提示他这样做。这是我拥有的相关代码:
advanceHuman :: Board -> Board
advanceHuman b = do
let column = query
if (snd((possibleMoves b)!!(column-1)) == cha)
then updateBoard b p1 column
else advanceHuman b
query :: Int
query = do {
print ("escoge una columna vacia") ; -- choose empty column
input <- getLine ;
return (read input) }
如您所见,我尝试提示玩家,获取他的答案并将其传递给其他功能(假设玩家将合作并输入有效数字)。但是,这是我尝试编译时收到的错误消息
* Couldn't match expected type `Int' with actual type `IO b0'
* In a stmt of a 'do' block: print ("escoge una columna vacia")
In the expression:
do print ("escoge una columna vacia")
input <- getLine
return (read input)
In an equation for `query':
query
= do print ("escoge una columna vacia")
input <- getLine
return (read input)
|
47 | print ("escoge una columna vacia") ;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
据我所知,我应该能够在 do 块中打印一行,而不管该函数输出什么,对吗?什么问题,我是否误解了“做”的工作原理?
UPDT
根据要求,这些是涉及的其他功能
possibleMoves:: Board -> Board
possibleMoves b = take sx b
updateBoard:: Board -> String -> Int -> Board
updateBoard b pl col = b
更新板还没有实现,所以它只有一些虚拟代码来安抚编译器
p1 cha 和 sx 是预先声明的全局常量
基本上,我切掉我的棋盘顶部以检查哪些列已满('_' = 空),检查玩家用“查询”指定的列的顶部,看看它是否合法;如果没有,则该过程再次开始。