2014-06-06 56 views
0

嗨,大家好我有一个小问题,我一直在努力几个小时,所以我想也许你可以帮助我。我想指出,我刚开始学习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]] 

感谢所有帮助

回答

1

不幸的是,3元组没有内置函数抽取n个值(如FST和SND 2元组),所以你可能会想要写一个

third3 (_, _, x) = x 

一旦你有了这个,你只需要使用map嵌套的两倍。

map (map third3) theList 
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

“地图”这个词在这里有点烦人...... – leftaroundabout

1

可以在部分解决这个问题:

getThird (_,_, x) = x  
-- Using pattern matching to get the third element of Map 

map结合这三元的内部列表转换成列表包含三要素:

getThirdElements = map getThird 

使用上述功能与map得到您想要的答案

getListOfFields = map getThirdElements 
相关问题