我正在尝试设置一些功能来帮助我正在处理的当前项目。我是Haskell的新手,正在努力实现所需的功能。
我有一个列表[a]
,并希望它输出四个不同列表([b],[b],[b],[b])
的元组,其中列表[a]
中的每个项都连续放置到输出元组中的下一个列表中。因此,输入列表[a]
中的第一个元素进入第一个列表[b]
,[a]
中的第二个元素进入第二个列表[b]
,[a]
中的第三个元素进入第三个列表[b]
,依此类推。
我尝试使用chunksOf和splitEvery / splitAt,但是无法获得正确的输出。并且帮助将不胜感激!谢谢!
最佳答案
您每次“旋转” 4元组并添加到第一个元素。因此,我们可以使用如下的foldr
模式实现此功能:
toFour :: [a] -> ([a], [a], [a], [a])
toFour = foldr (\a (bs, cs, ds, as) -> (a:as, bs, cs, ds)) ([], [], [], [])
或具有不可辩驳的模式:
toFour :: [a] -> ([a], [a], [a], [a])
toFour = foldr (\a ~(bs, cs, ds, as) -> (a:as, bs, cs, ds)) ([], [], [], [])
因此,这里
(bs, cs, ds, as)
是我们为列表尾部生成的4元组,然后我们向右“旋转”以构建元组(as, bs, cs, ds)
,然后将a
项放在4元组的第一个列表之前。对于整数列表,这给我们:
Prelude> toFour [1..2]
([1],[2],[],[])
Prelude> toFour [1..3]
([1],[2],[3],[])
Prelude> toFour [1..4]
([1],[2],[3],[4])
Prelude> toFour [1..5]
([1,5],[2],[3],[4])
Prelude> toFour [1..6]
([1,5],[2,6],[3],[4])
Prelude> toFour [1..10]
([1,5,9],[2,6,10],[3,7],[4,8])
当我们使用不可辩驳的模式时,这是懒惰的,因此我们可以例如分配无限列表的元素,然后例如获取第二项的前10个元素:
Prelude> (\(_, l, _, _) -> take 10 l) (toFour [1..])
[2,6,10,14,18,22,26,30,34,38]
关于list - Haskell:从输入列表创建列表元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60685978/