【发布时间】:2012-02-06 07:20:41
【问题描述】:
假设我有如下数据类型:
data Cell = Cell (Maybe Player)
data Board = Board [[Cell]]
现在我想生成一个这样的递归函数:
genBoard :: [Cell] -> Board
genBoard [] = []
genBoard c = (take 3 c) : (genBoard $ drop 3 c) -- takes list of 9 Cells and gives 3x3 list of cells
显然,上述代码失败了,因为 (:) 不能将 [Cell] 添加到 Board,尽管从技术上讲,Board 只不过是 [[Cell]]。我需要将 Board 作为单独的数据类型来为其提供我自己的显示功能。
到目前为止,我想出的最好的是:
genBoardList :: [Cell] -> [[Cell]]
genBoardList [] = []
genBoardList c = (take 3 c) : (genBoardList $ drop 3 c)
boardListToBoard :: [[Cell]] -> Board
boardListToBoard [] = Board []
boardListToBoard s = Board s
genBoard :: [Cell] -> Board
genBoard = boardListToBoard . genBoardList
但这似乎有点太长了,而且很难完成一件看似简单的事情。有什么想法可以改进我的代码吗?
【问题讨论】:
-
顺便说一句,您的
boardListToBoard函数可以替换为Board(即genBoard = Board . genBoardList)。另请注意,无需单独处理[]案例。