idris - 尝试为两人游戏键入决策树
问题描述
我想为一个两人游戏(例如井字游戏)构建一个决策树,它的类型确保它是完整的。也就是说,我希望树节点的类型能够确保它的子节点恰好是它的所有后继节点。
这是我在伊德里斯的尝试。Tic-Tac-Toe 很复杂,所以我做了一个简单得多的游戏:在 ( A | B | C
) 处移动三个位置,并且游戏在移动后结束。
DTNode
是“决策树节点”。
data Player = Computer | Human
Eq Player where
Computer == Computer = True
Human == Human = True
_ == _ = False
Show Player where
show Computer = "Computer"
show Human = "Human"
opponent : Player -> Player
opponent Computer = Human
opponent Human = Computer
data Position = A | B | C
Move : Type
Move = (Player, Position)
State : Type
State = List Move
isFinal : State -> Bool
isFinal (a::_) = True
isFinal _ = False
successorStates : State -> (toMove: Player) -> List State
successorStates s toMove = case (isFinal s) of
True =>
[]
False =>
[(toMove, A)::s, (toMove, B)::s, (toMove, C)::s]
mutual
SuccessorDTNodeType : (s : State) -> (toMove: Player) -> (successors: List State) -> Type
SuccessorDTNodeType _ _ [] = the Type ()
SuccessorDTNodeType s toMove (successor::rest) = DTNode successor (opponent toMove) oneLevelDownNodeType -> SuccessorDTNodeType s toMove rest where
oneLevelDownNodeType = SuccessorDTNodeType successor (opponent $ opponent toMove) (successorStates successor toMove)
data DTNode : (s: State) -> (toMove: Player) -> SuccessorDTNodeType s toMove (successorStates s toMove) -> Type where
我收到以下类型错误:
|
45 | oneLevelDownNodeType = SuccessorDTNodeType successor (opponent $ opponent toMove) (successorStates successor toMove)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When checking right hand side of Main.SuccessorDTNodeType, oneLevelDownNodeType with expected type
SuccessorDTNodeType successor (opponent toMove) (successorStates successor (opponent toMove))
Type mismatch between
Type (Type of SuccessorDTNodeType successor (opponent (opponent toMove)) (successorStates successor toMove))
and
SuccessorDTNodeType successor
(opponent toMove)
(case isFinal successor of
True => []
False => [(toMove, A) :: s, (toMove, B) :: s, (toMove, C) :: s]) (Expected type)
我只是略懂;我的猜测是Type
, 的返回类型SuccessorDTNodeType
不够具体,无法满足我的DTNode
构造函数的要求。
是这样吗,如果是这样,我可以做些什么来解决它吗?
解决方案
推荐阅读
- ios - 如何利用 PageViewController 根据用户的输入生成新的页面视图?
- php - 想使用php显示所有服务下的所有活动
- ios - Swift注释“标签”
- c++ - 为什么模板类的成员需要通过其模板类的参数来参数化
- c++ - Gdiplus Bitmap 没有 Alpha 通道
- php - 简单的 html dom 可以找到 PHP 脚本()?
- laravel - 发现错误的嵌套样式标签,然后在 laravel 中播种数据库
- angular - Angular/cli 未正确安装
- mongodb - 如何在聚合中使用_id?
- java - Spring hibernate直到最后都没有提交