0

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 は事前に宣言されたグローバル定数です

基本的に、ボードの上部を切り落として、どの列がいっぱいになっているか ('_' = 空) を確認し、プレーヤーが「クエリ」で指定した列の上部をチェックして、それが合法的な動きかどうかを確認します。そうでない場合は、プロセスが再び開始されます。

4

2 に答える 2