gpt4 book ai didi

math - 定义递归数据结构

转载 作者:行者123 更新时间:2023-12-04 16:35:16 26 4
gpt4 key购买 nike

我正在尝试学习 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)我不知道为什么。

    谢谢!我感谢您的帮助。

    最佳答案

    您不能使用 fstsnd作用于类型 Game .由于您尚未在数据构造函数中为字段声明名称 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 发生什么事情构造函数,所以你必须填写那些 ???是你自己

    关于math - 定义递归数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12690480/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com