私はHaskellを学び、Combinatorial Game Theoryを実装するのに最適な言語だと思っています。私は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)
私は、Wikibookで議論されているように、ゲームはややツリーに似ているが、追加の制限があることを認識しています。
- ポジション(ツリーノードへの親族)は、位置だけで何の可能な動きを持っていない他のゲーム
- 特別なゲーム、ゼロがありますが、含まれていてもよい多くの可能な移動
- を持つことができます。
- すべてのゲームはゼロを使用して構築されています。
私はputL
を書いたとき、だから私は、あるポジションを(返却、b
の最初の部分にゲームa
と別のゲームb
、両論a
を取り、単独b
の第二の部分を残す」、と言いますゲームの種類)。少なくとも、それは私がやろうとしていることです。代わりにハスケルは私が戻ってくるタイプが([Game], b0)
だと思っているのですが、私はその理由を知らないのです。
ありがとうございました!私はあなたの助けに感謝します。
ことができません。 – hammar
私は参照してください。私はタプルを使用しました。なぜなら、2つの位置のセットしか持たず、2つのリストがデータ構造で定義されているからです。 この関数では、どのタイプが位置として入るかを定義して、私が望むものを返すことができます。 –