gpt4 book ai didi

Haskell迭代二维列表,过滤,输出一维列表

转载 作者:行者123 更新时间:2023-12-03 14:49:04 27 4
gpt4 key购买 nike

我以为我在 Haskell 学习中一帆风顺,直到...

我有一个 [[Int]]

tiles = [[1,0,0]
,[0,1,0]
,[0,1,0]
]

和数据类型:
data Coord = Coord
{ x :: Int
, y :: Int
} deriving (Eq)

基于输入 tiles ,我一直在尝试输出 [Coord] , 这样一个 Coord仅在 tiles 的值时生成为 1, Coord将其位置存储在二维列表中:
blackBox :: [[Int]] -> [Coord]
blackBox tiles = <magic>
-- given the above example I would expect:
-- [(Coord 0 0),(Coord 1 1),(Coord 1 2)]

我尝试过诸如首先将 [[Int]] 转换为 [Int] 的方法,方法是:
foldTiles :: [[Int]] -> [Int]
foldTiles tiles = foldr (++) [] tiles

但在那之后我不太确定如何传递索引。我想如果我可以映射“折叠瓷砖”,输出一个元组(值,索引),我可以很容易地找出其余的。

更新 如果有人感兴趣,我可以让它工作,这是一个演示(带有源代码和 GitHub 链接)!我将不得不花更多时间来理解每个答案,因为这是我第一次使用 FP 编写游戏。非常感谢!

http://kennycason.com/posts/2013-10-10-haskell-sdl-gameboy-boxxle.html

最佳答案

这是列表推导大放异彩的地方。

blackBox tiles =
[Coord x y -- generate a Coord pair
| (y, row) <- enumerate tiles -- for each row with its coordinate
, (x, tile) <- enumerate row -- for each tile in the row (with coordinate)
, tile == 1] -- if the tile is 1
或者您可以选择等效的 do表示法(因为 list 是一个 monad),这需要导入 Control.Monad (对于 guard 。)
blackBox tiles = do
(y, row) <- enumerate tiles -- for each row with its coordinate
(x, tile) <- enumerate row -- for each tile in the row (with coordinate)
guard (tile == 1) -- as long as the tile is 1
return (Coord x y) -- return a coord pair
为了帮助理解,后一个函数的工作方式类似于以下 Python 函数。
def black_box(tiles):
for y, row in enumerate(tiles):
for x, tile in enumerate(row):
if tile == 1:
yield Coord(x, y)
do我认为,list monad 的符号对于处理列表非常方便,所以值得你花点心思!

在这两个例子中,我都使用了定义
enumerate = zip [0..]

关于Haskell迭代二维列表,过滤,输出一维列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19308845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com