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 ブロックに行を出力できるはずです。「do」がどのように機能するかを誤解していますか?
UPDT
要求に応じて、これらは関連する他の機能です
possibleMoves:: Board -> Board
possibleMoves b = take sx b
updateBoard:: Board -> String -> Int -> Board
updateBoard b pl col = b
Updateboard はまだ実装されていないため、コンパイラをなだめるためのダミー コードがいくつかあるだけです。
p1 cha と sx は事前に宣言されたグローバル定数です
基本的に、ボードの上部を切り落として、どの列がいっぱいになっているか ('_' = 空) を確認し、プレーヤーが「クエリ」で指定した列の上部をチェックして、それが合法的な動きかどうかを確認します。そうでない場合は、プロセスが再び開始されます。