Haskell从列表列表中选择最后一项

时间:2014-06-06 00:04:41

标签: list haskell

大家好我有一点问题,我已经挣了几个小时,所以我想也许你可以帮助我。我想指出我刚开始学习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]]

感谢您的帮助

3 个答案:

答案 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