我在努力学习Haskell,认为这将是实现Combinatorial Game Theory的完美语言。我在Python中做了一些这样的工作来教自己的OOP原则和运算符重载,但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
我说,“把一个游戏a
和另一场比赛b
,利弊a
成b
的第一部分,并独自离开的b
第二部分,返回的位置(这是一个一种游戏)“。至少,这正是我想要做的。相反,Haskell认为我返回的类型是([Game], b0)
,我不知道为什么。
谢谢!我感谢您的帮助。
实际上,零和游戏已经被'位置[] []'表示,所以没有必要为这额外的构造函数。 – hammar
我明白了。我使用了一个元组,因为我只想要两组位置,但这是不必要的,因为这两个列表是在数据结构中定义的。 而对于函数,您可以定义什么类型作为位置进入,返回我想要的。 –