2

そこで、ヘキサポーン ゲームを作成し、ボードが勝利状態にある場合に True を返す関数を作成しようとしています。現時点では次のようになります。

checkWin :: BoardState -> Bool
checkWin b1@(blackPieces,whitePieces,turn,size,win)
  |(length blackPieces) == 0 = True
  |(length whitePieces) == 0 = True
  |length (generateMoves b1) == 0 = True
  |otherwise = False

したがって、これは、黒または白のピースが残っていない場合、または誰も移動できない場合に機能しますが、反対のポーンがボードの端に到達した場合は機能しません (ヘキサポーンで勝つ別の方法)。変数blackPieceswhitePiecesは座標のリスト、すなわち [(1,1),(2,1),(3,1)] で、サイズnのボード上でこれらのポーンがどこにあるかを示します (その白がターンする場合、ターンは true です)。

これらの条件をメソッドに追加したくなりましたが、コンパイラはそれを気に入りませんでした。

  |(_,1) `elem` whitePieces = True
  |(_,size) `elem` blackPieces = True

「 2番目の要素が1である(つまり、ボードの反対側に到達した)whitePiecesにタプルはありますか」と言う他の方法はありますか?

有益なコメントをお寄せいただきありがとうございます。

4

3 に答える 3

7

[a]そのため、何かのリスト、何かに対する述語を受け取り、(a->Bool)を返す関数が必要ですBoolHoogleを簡単にチェックして、元に戻ります

any :: (a -> Bool) -> [a] -> Bool
Applied to a predicate and a list, any determines if any element of
the list satisfies the predicate. For the result to be False, the list must be finite

そう

 (_,1) `elem` whitePieces 

になる

 any (\(_, x) -> x == 1) whitePieces

または(エターナルマットが私に思い出させたように)

any (==1) ( map snd whitePieces )

等々


ところで、リストが空であることを確認する最良の方法は、パターン マッチングまたはnull関数を使用することです。length == 0 メソッドは、リンクされたリストのすべてをウォークスルーし、リストが無限の場合は無限ループに入る可能性さえあります。

于 2011-10-23T22:32:47.930 に答える
2

コンパイラがそれを好まない理由は、パターン マッチ_でしか機能しないためです。アンダースコアは、「データのこの部分を変数名にバインドできますが、その必要はありません」という意味です。

あなたがそれを使おうとした方法は異なります:あなたは基本的に「の要素であるそのようなものは存在しますか?」と言った。x(x,1)whitePieces

違いがわかりますか?Haskell 2010 > Expressions # Patter Matchingも参照してください。

于 2011-10-24T03:12:25.650 に答える
2

たとえば、次を使用できますfilter

not $ null (filter wincond whitePieces)
    where wincond x = snd x == 1

この式は、2 番目のエントリTrueを持つ のリストが空のリスト ( )でない場合です。whitePieces1[]

または使用できますmap

or (map (\x -> snd x == size) blackPieces)

blackPiecesこの式は次のことを行います: 最初に の要素がと等しい 2 番目のエントリを持っているかどうかをチェックし、 and ( )sizeのリストを返します。TruesFalses[Bool]orTrueTrue

于 2011-10-23T22:23:42.540 に答える