我希望将元组列表:[(2,2,2),(3,3,3),(4,4,4),(5,5,5)]转换为列表:[2,2,2,3,3,3,4,4,4,5,5,5]。请使用以下代码实现:
我该如何使用 lambda?为什么我的代码不能正常工作?
map (\(a,b,c,d)->a:b:c:d) listOfTuples
但是会出现错误。
Prelude> map (\(a,b,c)->a:b:c) [(1,2,3), (5,6,7)]
<interactive>:1:37:
No instance for (Num [t])
arising from the literal `7' at <interactive>:1:37
Possible fix: add an instance declaration for (Num [t])
In the expression: 7
In the expression: (5, 6, 7)
In the second argument of `map', namely `[(1, 2, 3), (5, 6, 7)]'
Prelude>
我该如何使用 lambda?为什么我的代码不能正常工作?
map
来实现,因为输入列表中的每个元素只能映射到输出列表中的一个元素。 - hammarfoldr (\(a,b,c) l -> a:b:c:l) [] [(1,2,3),(4,5,6)]
这段代码的作用是将一个包含两个三元组的列表转换为一个列表。在转换过程中,每个三元组(a,b,c)
被展开为a
,b
,c
以及之前已经处理好的列表l
,然后将它们依次添加到新列表的头部。最终的结果会是[1,2,3,4,5,6]
。其中foldr
是一个高阶函数,它接受一个函数作为参数,并按照列表的从右向左的顺序对其进行折叠操作。 - Riccardo T.concatMap f xs
只会遍历列表一次;同样适用于concat (map f xs)
。 - ehird[(a,b,c),(d,e,f)] >>= \(x,y,z) -> [x,y,z]
。 - Sarah