【发布时间】:2012-10-02 21:24:58
【问题描述】:
我正在尝试学习 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 中讨论的树,但它们有额外的限制。
- 一个位置(类似于树节点)可以有许多可能的移动
- 一个职位只能包含其他游戏
- 有一个特殊的游戏,零,没有可能的动作。
- 所有游戏都是使用 Zero 构建的。
所以当我写putL 时,我会说,“拿一个游戏a 和另一个游戏b,将a 的缺点放在b 的第一部分,留下b 的第二部分单独,返回一个位置(这是一种游戏)。”至少,这就是我想要做的。相反,Haskell 认为我返回的类型是([Game], b0),我不知道为什么。
谢谢!感谢您的帮助。
【问题讨论】: