【问题标题】:Defining recursive data structures定义递归数据结构
【发布时间】: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 中讨论的树,但它们有额外的限制。

  1. 一个位置(类似于树节点)可以有许多可能的移动
  2. 一个职位只能包含其他游戏
  3. 有一个特殊的游戏,零,没有可能的动作。
  4. 所有游戏都是使用 Zero 构建的。

所以当我写putL 时,我会说,“拿一个游戏a 和另一个游戏b,将a 的缺点放在b 的第一部分,留下b 的第二部分单独,返回一个位置(这是一种游戏)。”至少,这就是我想要做的。相反,Haskell 认为我返回的类型是([Game], b0),我不知道为什么。

谢谢!感谢您的帮助。

【问题讨论】:

    标签: math haskell


    【解决方案1】:

    您不能在 Game 类型的东西上使用 fstsnd 函数。由于您尚未在数据构造函数ZeroPosition 中为字段声明名称,因此实际访问它们的唯一方法是通过模式匹配。 (请注意,我还删除了 Position 构造函数中不必要的元组)

    data Game
      = Zero
      | Position [Game] [Game]
    
    putL :: Game -> Game -> Game
    putL game Zero = ???
    putL game (Position games1 games2) = Position (game : games1) games2
    

    现在,我显然不知道你想为Zero 构造函数发生什么,所以你必须自己填写那些???

    【讨论】:

    • 其实零游戏已经用Position [] []表示,所以不需要额外的构造函数了。
    • 我明白了。我使用元组是因为我只想拥有两组位置,但这是不必要的,因为这两个列表是在数据结构中定义的。而对于函数,你可以定义什么类型进入一个位置,返回我想要的。
    【解决方案2】:

    dflemstr 的回答是正确的。我将解释您收到的错误消息。

    • a : fst b 必须有类型 [Game] --- 同意,是吗?
    • 因此a 必须具有Game 类型...(确实如此,万岁)
    • ...和fst b 必须具有[Game] 类型
    • fst 将一对作为输入,并产生对的第一个元素,所以...
    • ...b 必须有 ([Game], b0) 类型(对于某些我们还没有解决的 b0 类型)(这是 预期的类型)
    • 这是一个问题,因为根据putL 的类型签名,b 必须具有Game 类型(这是实际 类型)--- 它不能是对

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      相关资源
      最近更新 更多