大家好我有一点问题,我已经挣了几个小时,所以我想也许你可以帮助我。我想指出我刚开始学习Haskell。
所以我有一个名为Field
的数据类型和一个名为Map
的类型,它是根据字段的坐标和该字段的类型创建的
data Field = SM | S | M | W
type Map = (Int, Int, Field)
我还有一个返回地图列表列表的函数,如下所示:
[[(1,1,W),(1,2,W),(1,3,W)],[(2,1,W),(2,2,SM),(2,3,W)],[(3,1,W),(3,2,W),(3,3,W)]]
现在这里是我被卡住的部分。我需要编写一个函数,只从该列表中获取Map
的第三个变量,并将其作为另一个列表返回:
[[W,W,W],[W,SM,W],[W,W,W]]
感谢您的帮助
答案 0 :(得分:3)
使用匿名函数实际上可以轻松完成:
Prelude> data Field = SM | S | M | W deriving (Eq, Show)
Prelude> map (map $ \(_,_,field) -> field) [[(1,1,W),(1,2,W),(1,3,W)],[(2,1,W),(2,2,SM),(2,3,W)],[(3,1,W),(3,2,W),(3,3,W)]]
[[W,W,W],[W,SM,W],[W,W,W]]
但是,首选方法是使Map
成为正确的data
类型,而不仅仅是元组重新定义。
data MapCell = MapCell {
mapLocX, mapLocY :: Int
, mapField :: Field
} deriving (Eq, Show)
然后使用map (map mapField)
。请注意,您现在无法按照现在的方式定义列表......但无论如何都有很多冗余信息。更好地构建它:
type Chart = [[MapCell]]
yourMap :: Chart
yourMap = zipWith (\y fs -> zipWith (\x -> MapCell x y) [1..]) [1..]
[ [W, W, W]
, [W, SM,W]
, [W, W, W] ]
答案 1 :(得分:1)
不幸的是,3元组没有内置函数来提取第n个值(如2元组的fst和snd),所以你可能想写一个
third3 (_, _, x) = x
完成后,只需使用map
嵌套两次。
map (map third3) theList
答案 2 :(得分:1)
您可以部分解决此问题:
getThird (_,_, x) = x
-- Using pattern matching to get the third element of Map
将此与map
相结合,将三元组的内部列表转换为包含第三元素的列表:
getThirdElements = map getThird
将上述功能与map
一起使用,以获得所需的答案
getListOfFields = map getThirdElements