Haskell A「;“什么也不做”;递归函数的保护?

Haskell A「;“什么也不做”;递归函数的保护?,haskell,recursion,Haskell,Recursion,我们有下面的函数来建立一棵树。 这是一棵树,它有一个节点和任意多的子树 generateGameTree g p = Node (g,p) [ ((fst x),generateGameTree (snd x) (nextPlayer p)) | x <- (findPossibleMoves p g) ] generategametreegp=Node(g,p)[((fst x),generateGameTree(snd x)(nextPlayer p))|x首先,说Haskell做

我们有下面的函数来建立一棵树。 这是一棵树,它有一个节点和任意多的子树

generateGameTree g p = Node (g,p) [ ((fst x),generateGameTree (snd x) (nextPlayer p))  | x <- (findPossibleMoves p g) ]
generategametreegp=Node(g,p)[((fst x),generateGameTree(snd x)(nextPlayer p))|x首先,说Haskell做了一些事情,这是声明性编程和惰性编程的全部要点。您描述了输出。它的实际生成方式取决于编译器

要回答您的问题,您可以稍微更改一下函数,使其允许
可能

generateGameTree g p = 
    | identifyWinner g p == Nothing = Just $ Node (g,p) $ filter (isJust . snd) [ ((fst x),generateGameTree (snd x) (nextPlayer p))  | x <- (findPossibleMoves p g) ]
    | otherwise = Nothing
首先,如果说Haskell做了一些事情,这是声明式编程和惰性编程的全部要点,这是相当不符合Haskell的。您描述了输出。它的实际生成方式取决于编译器

要回答您的问题,您可以稍微更改一下函数,使其允许
可能

generateGameTree g p = 
    | identifyWinner g p == Nothing = Just $ Node (g,p) $ filter (isJust . snd) [ ((fst x),generateGameTree (snd x) (nextPlayer p))  | x <- (findPossibleMoves p g) ]
    | otherwise = Nothing
如果你有一个函数

nextPositions :: Game -> [Game]
它给出了在给定位置采取每一个可能的移动所能产生的所有位置,那么一个游戏树就是一个
Cofree[]game
from

它可以用

generateGameTree :: Game -> GameTree
generateGameTree = coiter nextPositions
如果赢得的位置没有下一个位置,则生成将自动停止在赢得的位置。如果需要,您可以将其转换为更常见的
数据树
表示形式。

如果您有功能

generateGameTree g p = Node (g,p) [ ((fst x),generateGameTree (snd x) (nextPlayer p))  | x <- (findPossibleMoves p g) ]
nextPositions :: Game -> [Game]
它给出了在给定位置采取每一个可能的移动所能产生的所有位置,那么一个游戏树就是一个
Cofree[]game
from

它可以用

generateGameTree :: Game -> GameTree
generateGameTree = coiter nextPositions

如果赢得的位置没有下一个位置,则生成将自动停止在赢得的位置。然后,如果需要,您可以将其转换为更常见的
数据.Tree
表示形式。

如果已经有赢家,这意味着游戏已经结束,并且没有更多的移动,那么这就是结果,即游戏的当前状态以及没有孩子的列表,因此:

generateGameTree g p = Node (g,p) [ ((fst x),generateGameTree (snd x) (nextPlayer p))  | x <- (findPossibleMoves p g) ]
makeGameTree g p =
  | identifyWinner g p == Nothing =
    Node (g,p) [ (fst x, makeGameTree (snd x) (nextPlayer p))
               | x <- (findPossibleMoves p g) ]
  | otherwise = Node (g,p) []
makegametreegp=
|identificationg p==无=
节点(g,p)[(fst x,makeGameTree(snd x)(nextPlayer p))

|x如果已经有赢家,这意味着游戏已经结束,没有更多的动作,那么结果应该是,游戏的当前状态以及没有孩子的列表,因此:

makeGameTree g p =
  | identifyWinner g p == Nothing =
    Node (g,p) [ (fst x, makeGameTree (snd x) (nextPlayer p))
               | x <- (findPossibleMoves p g) ]
  | otherwise = Node (g,p) []
makegametreegp=
|identificationg p==无=
节点(g,p)[(fst x,makeGameTree(snd x)(nextPlayer p))
|x不应该是“什么都不做”。应该是返回根条件并让堆栈展开。不应该是“什么都不做”。应该是返回根条件并让堆栈展开。