在Haskell方格的方格桌

时间:2014-03-24 08:56:16

标签: haskell

有时您需要一个方格的数据结构,例如,如果您为棋盘建模。表示方格数据的最简单方法是通过列表列表。

[[0,1,0],
 [1,0,1],
 [0,1,0]]

以上是方格列表的示例。我的第一次尝试:

import Data.List

checker :: Integral i => i -> a -> a -> [[a]]
checker n a b = genericTake n $ intersperse (genericTake n xs2) $ repeat (genericTake n xs1)
  where xs1 = checker' a b
        xs2 = drop 1 xs1

checker' :: a -> a -> [a]
checker' a b = intersperse b $ repeat a

代码很详细,但结果是正确的:

*Main> checker 5 0 1
[[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]]

如何在Haskell中编写一个函数来创建任意大小的列表?

1 个答案:

答案 0 :(得分:9)

evenRow = 0:oddRow                -- evenRow = 0:1:evenRow
oddRow  = 1:evenRow
board   = evenRow:oddRow:board

这是一块无限格仔板。锯掉任何矩形部分:

smallBoard = take 17 $ map (take 11) board

根据需要对此进行参数化。

编辑:为了便于说明,我没有在这里使用cycle。在实际代码中你可能想要它:

board = cycle [cycle [0,1], cycle [1,0]]

它短得多,但坦率地看起来相当神秘。