【发布时间】:2017-06-01 21:33:27
【问题描述】:
Haskell 新手,尝试构建一个 [[(Int, Int)]],其中每个元素都是其对应的网格位置,由另一个板 [[a]] 构建。因此,边长为 3 的正方形 [[a]] 将创建
[[(0, 0), (1, 0), (2, 0)]
,[(0, 1), (1, 1), (2, 1)]
,[(0, 2), (1, 2), (2, 2)]]
(最终我将使用map (map ...) 将其迭代为[[a]] -> (Int, Int) -> b 类型的函数以创建[[b]],所以如果我遗漏了一些更容易的东西,请告诉我!)
在 Python 中,我可能会执行以下操作:
[[(x,y) for (x,_) in enumerate(board[y])] for (y,_) in enumerate(board)]
也就是说,我会使用 enumerate 内置函数来构造 (index, element) 元组并丢弃元素。
我知道在 Haskell 中我可以做到:
[[(x,y) | x <- [0..length (board!!y)-1]] | y <- [0..length board-1]]
但是 Python (for foo in range(len(bar))) 中的那些结构有点反模式,并且非常不鼓励。在 Haskell 中也是这样吗?
如果我像编写 Python 一样编写 Haskell,我会这样做:
[[(x,y) | (x,_) <- zip [0..] (board!!y)] | (y,_) <- zip [0..] board]
这是不受欢迎的吗?
【问题讨论】:
-
更一般地说:在 Python 中,如果它写得好且符合习惯,我们会谈论“Pythonic”。 “Haskellion”结构在这里有类似的术语吗?
标签: list haskell list-comprehension enumerate