我有一个看起来像这样的元组列表。
[ [(1,True),(2,True)] , [(3,False),(4,False),(5,False)] ]
我的目标是让[1,2,3,4,5]
弄出那个烂摊子。
我尝试使用map
和filter
删除所有Bool
,但filter
也删除了元组中的第一个元素。如果我可以删除每个元组中的Bool
,那么我可以使用循环将每个元组的fst
分配给一个新的空列表?
答案 0 :(得分:9)
f :: [[(a, b)]] -> [a]
f = concatMap (map fst)
然后f [ [(1,True),(2,True)] , [(3,False),(4,False),(5,False)] ]
为[1,2,3,4,5]
。
答案 1 :(得分:4)
或者列表推导:
f xss = [fst x | xs <- xss, x <- xs]
答案 2 :(得分:3)
试试这个(编辑,感谢 Michael Kohl 和 pat 的评论):
fun :: [[(a,b)]] -> [a]
fun = map fst . concat
然后在GHC:
*Main> let l = [ [(1,True),(2,True)] , [(3,False),(4,False),(5,False)] ]
[[(1,True),(2,True)],[(3,False),(4,False),(5,False)]]
*Main> fun l
[1,2,3,4,5]
答案 3 :(得分:0)
foldl1 (\acc x -> acc ++ x) [a | b <- lst, let a = map fst b]