5

Haskell は、組み合わせゲーム理論を実装するのに最適な言語であると考えて、Haskell を学習しようとしています。OOP の原則と演算子のオーバーロードを独学するために Python でこれをある程度行いましたが、Haskell は構文がより数学的に見え、数学のバックグラウンドを持っているため、私はそれが本当に好きです。また、無限リストを遅延して実装したことは非常に驚くべきことです。

とにかく、これまでのところコンパイル可能なデータ構造ですが、それを使用して記述した最初の関数は次のようになります。

Prelude> :l cgt
[1 of 1] Compiling Main             ( cgt.hs, interpreted )

cgt.hs:8:30:
    Couldn't match expected type `([Game], b0)' with actual type `Game'
    In the first argument of `fst', namely `b'
    In the second argument of `(:)', namely `(fst b)'
    In the expression: a : (fst b)
    Failed, modules loaded: none.

これが私のコードです...

--A game that is Zero (base case) is two empties
--Anything else must be two lists of games, a left list and a right list.

data Game = Zero
          | Position ([Game], [Game])

putL :: Game -> Game -> Game
putL a b = Position (a :(fst b), snd b)

ウィキブックで説明されているように、ゲームはツリーに似ていますが、追加の制限があります。

  1. 位置 (ツリー ノードと同類) には、多くの可能な動きがあります。
  2. ポジションには他のゲームのみを含めることができます
  3. 動きのない特別なゲーム、ゼロがあります。
  4. すべてのゲームはゼロを使用して構築されています。

だから私が書いたとき、私はこうputL言いました。少なくとも、それが私がやろうとしていることです。代わりに、Haskell は、私が返す型が であると考えていますが、その理由はわかりません。ababb([Game], b0)

ありがとうございました!私はあなたの助けに感謝します。

4

2 に答える 2

10

fstタイプの何かでandsnd関数を使用することはできませんGameZeroデータコンストラクターとでフィールドの名前を宣言していないため、Position実際にフィールドにアクセスする唯一の方法は、パターンマッチングを使用することです。Position(コンストラクターで不要なタプルも削除したことに注意してください)

data Game
  = Zero
  | Position [Game] [Game]

putL :: Game -> Game -> Game
putL game Zero = ???
putL game (Position games1 games2) = Position (game : games1) games2

Zeroさて、私は明らかにコンストラクターに対して何をしたいのかわからないので、それらを???自分で入力する必要があります。

于 2012-10-02T12:49:49.133 に答える
6

dflemstr の答えは正しいです。表示されたエラー メッセージについて説明します。

  • a : fst bタイプが必要[Game]です --- はい、同意しましたか?
  • したがって、aタイプが必要Gameです...(そして、そうです、万歳)
  • ...そしてfst b型が必要です[Game]
  • fst入力としてペアを取り、ペアの最初の要素を生成するので...
  • ...bタイプが必要です (まだ解決していない([Game], b0)タイプb0の場合) (これは予想されるタイプです)
  • の型シグネチャによると、 には型putLb必要ですGame(これは実際の型です) --- ペアにすることはできません。
于 2012-10-02T13:24:58.903 に答える