2012-10-02 16 views
5

私は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で議論されているように、ゲームはややツリーに似ているが、追加の制限があることを認識しています。

  1. ポジション(ツリーノードへの親族)は、位置だけで何の可能な動きを持っていない他のゲーム
  2. 特別なゲーム、ゼロがありますが、含まれていてもよい多くの可能な移動
  3. を持つことができます。
  4. すべてのゲームはゼロを使用して構築されています。

私はputLを書いたとき、だから私は、あるポジションを(返却、bの最初の部分にゲームaと別のゲームb、両論aを取り、単独bの第二の部分を残す」、と言いますゲームの種類)。少なくとも、それは私がやろうとしていることです。代わりにハスケルは私が戻ってくるタイプが([Game], b0)だと思っているのですが、私はその理由を知らないのです。

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

答えて

10

タイプGameのいずれかにfstおよびsnd関数を使用することはできません。データコンストラクタZeroPositionにフィールドの名前を宣言していないので、実際にそれらにアクセスする唯一の方法は、パターンマッチングによるものです。

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

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

さて、私は明らかにあなたがZeroコンストラクタのために起こるしたいのか分からないので、あなたは、「これらの???に記入する必要があります(私もPositionコンストラクタで不要なタプルを除去したことに注意してください)あなた自身。

+4

ことができません。 – hammar

+0

私は参照してください。私はタプルを使用しました。なぜなら、2つの位置のセットしか持たず、2つのリストがデータ構造で定義されているからです。 この関数では、どのタイプが位置として入るかを定義して、私が望むものを返すことができます。 –

6

dflemstrの答えが正しい。私はあなたが持っているエラーメッセージについて説明します。

  • a : fst bは、タイプが[Game]である必要がありますか?
  • 従ってaは...タイプGameを有していなければならない(それはフレー、ない)
  • ...とfst bタイプ[Game]
  • fstを有していなければならないが、入力としてペアを受け取り、ペアの最初の要素を得、 so ...
  • ...bは(putLのための型シグネチャによると、bはタイプGameを持っている必要がありますので
  • これが問題である(これは期待タイプがある)(我々はまだ働いていないいくつかのタイプb0用)タイプ([Game], b0)を持っている必要がありますこれは)実際タイプである---これは、実際、ゼロゲームが既に[] [] `それのための余分なコンストラクタを必要としない位置`で表される対
+0

ありがとう、それははるかに明確にされています! –

関連する問題