【发布时间】:2014-08-12 03:40:10
【问题描述】:
我有一个函数onemove,我正在递归调用列表moves。函数onemove返回一个三元组(Int,[Char],[[Char]]),即time、captures和board。对于moves 列表中的每个移动,我想在输入元组上调用函数onemove。到目前为止,我在下面提供了我的代码:
makemoves :: (Int,[Char],[[Char]],[(Int,Int)]) -> (Int,[Char],[[Char]])
makemoves (time, captures, board, [] ) = (time, captures, board)
makemoves (time, captures, board, (moveFrom, moveTo):moves )
| checkerAlive board = makemoves (onemove (time, captures, board, move:moves))
| otherwise = resetGame (time, captures, board)
where copyTime = time
copyCaptures = captures
copyBoard = board
move = (moveFrom,moveTo)
tempTuple = onemoving (time, captures, board, move)
如何递归调用函数makemoves? onemovereturns 一个 3 元组,而 makemoves 期望一个 4 元组,即返回的 3 元组加上下一步。谢谢!
【问题讨论】:
-
如果这个类型检查,为什么
onemove的类型签名和makemoves一样? -
我没有从你的代码中得到一些东西。例如为什么你有一个
copyBoard = board?此外,您可以使用@模式:move@(moveFrom, moveTo):moves,而不是在where子句中定义move。关于您的问题,在某些情况下,编写返回冗余信息的辅助函数并通过调用它并删除不需要的信息来编写实际函数会更容易。懒惰也会避免实际计算不需要的信息。