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)
ウィキブックで説明されているように、ゲームはツリーに似ていますが、追加の制限があります。
- 位置 (ツリー ノードと同類) には、多くの可能な動きがあります。
- ポジションには他のゲームのみを含めることができます
- 動きのない特別なゲーム、ゼロがあります。
- すべてのゲームはゼロを使用して構築されています。
だから私が書いたとき、私はこうputL
言いました。少なくとも、それが私がやろうとしていることです。代わりに、Haskell は、私が返す型が であると考えていますが、その理由はわかりません。a
b
a
b
b
([Game], b0)
ありがとうございました!私はあなたの助けに感謝します。