Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何将多态数据类型转换为单个元素列表_Haskell - Fatal编程技术网

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

Haskell 如何将多态数据类型转换为单个元素列表,haskell,Haskell,我想知道是否有可能将一个元组作为第一个元素存储第二个元素的出现次数,转换为一个元素列表,例如: [(2,'a'),(1,'b'),(4,'c')] ~> ['a','a','b','c','c','c','c'] 这种数据类型的定义是[(Int,a)](在本例中,我选择a作为字符)。您尝试过concatMap吗 示例列表: ls = [(2,True),(1,False),(4,True)] concatMap (\tp -> replicate (fst tp) (snd tp

我想知道是否有可能将一个元组作为第一个元素存储第二个元素的出现次数,转换为一个元素列表,例如:

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

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

您尝试过concatMap吗

示例列表:

ls = [(2,True),(1,False),(4,True)]

concatMap (\tp -> replicate (fst tp) (snd tp)) ls
映射函数,然后将其展开,从而得到最终列表:

=> [True,True,False,True,True,True,True]

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

  • 逐个处理每个元组
  • 仅正确处理一个元组(例如,
    (2,'a')
  • 您可以将其分解为两个函数。处理所有元组的一个将调用只处理每个元组一个元组的一个

    首先试着自己解决它,但如果您陷入困境,下面是代码基本结构的破坏者(包括两个函数的基本和递归case模式),但这不是完成的代码本身:

    repeatElements::[(Int,a)]->--插入结果类型
    repeatElements[]=--插入空列表基本情况的结果
    repeatElements((n,x):xs)=RepeatElement nx--插入递归的部分
    哪里
    RepeatElement::Int->a->--插入结果类型
    RepeatElement 0 ch=--插入零所需基本情况的结果
    RepeatElement n ch=--插入递归大小写的结果


    提示:使用
    复制
    。是的,这是可能的。我建议你把它分成小块。首先,编写一个函数
    f::(Int,a)->[a]
    ,它只对一个元组执行此操作。一旦你做到了这一点,那么对整个元组列表就更容易了。
    concatMap
    的第一个参数也可以拼写为
    uncurry replicate