如果可以基本上将元组转换为一个元组,该元组作为其第一个元素存储第二个元素的出现次数,例如:
[(2,'a'),(1,'b'),(4,'c')] ~> ['a','a','b','c','c','c','c']
这种数据类型的定义是[(Int, a)]
(在这个例子中,我选择a
作为字符(。
如果您正在学习基础知识并且应该自己构建基本功能,那么这个问题有两个部分:
- 一个接一个地处理每个元组。
- 只处理一个元组 (e.g.,
(2, 'a')
(正确。
您可以将其分解为两个函数。处理所有元组的元组将调用仅处理每个元组的一个元组的元组。
先尝试自己解决,但如果卡住了,下面是代码基本结构的剧透(包括两个函数的基本和递归大小写模式(,但并不是完成的代码本身:
<块引用类>repeatElements :: [(Int, a)] ->-- insert result type
repeatElements [] = -- insert result for empty list base case
repeatElements ((n, x):xs) = repeatAnElement n x -- insert part that recurses
where
repeatAnElement :: Int ->a ->-- insert result type
repeatAnElement 0 ch = -- insert result for zero-needed base case
repeatAnElement n ch = -- insert result for recursive case
块引用类>
你试过concatMap吗?
示例列表:
ls = [(2,True),(1,False),(4,True)]
concatMap (tp -> replicate (fst tp) (snd tp)) ls
你映射函数,然后扁平它,这样你得到最终列表:
=> [True,True,False,True,True,True,True]