如何将多态数据类型转换为单个元素列表



如果可以基本上将元组转换为一个元组,该元组作为其第一个元素存储第二个元素的出现次数,例如:

[(2,'a'),(1,'b'),(4,'c')] ~> ['a','a','b','c','c','c','c']

这种数据类型的定义是[(Int, a)](在这个例子中,我选择a作为字符(。

如果您正在学习基础知识并且应该自己构建基本功能,那么这个问题有两个部分:

  1. 一个接一个地处理每个元组。
  2. 只处理一个元组 (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]

最新更新