gpt4 book ai didi

list - 在 Haskell 中交错列表列表

转载 作者:行者123 更新时间:2023-12-04 04:46:39 26 4
gpt4 key购买 nike

我想知道如何在 Haskell 中编写一个将列表列表交错为单个列表的函数,例如,如果我有一个名为的函数
interleavelists :: [[a]] -> [a]
它应该能够交错元素。

示例:[[1,2,3] [4,5,6] [7,8]] --> [1,4,7,2,5,8,3,6] .

列表可以是有限的也可以是无限的...我可以使用 foldr ?

最佳答案

最快的写法是使用 transpose 来自 Data.List .

import Data.List

interleavelists :: [[a]] -> [a]
interleavelists = concat . transpose
transpose选择其参数的每个非空列表的第一个元素,将它们放入一个列表中,然后, transpose s 列表 tail s 参数的元素。 concat列出 transpose 的列表的结果根据需要交错列表。如果某些元素列表是无限的,它会起作用,但如果列表列表本身有无限多的元素,它当然永远不会超过 head 的列表。 s。但无论如何处理这种情况是有问题的。

使用 foldr交错列表并非易事。假设你有
interleavelists xss = foldr something zero xss
interleavelists []应该可能会产生 [] ,所以这就是 zero值(value)。和
interleavelists [xs] = xs

看起来很自然,所以
something xs [] = xs

但是如果第二个参数不是 [] 怎么办? ?然后你想插入 something的第一个参数的元素在不同的距离进入第二个参数。但在哪些距离?如果所有列表的长度相同,则每个列表的距离都是恒定的,那么您可以将距离作为进一步的参数传递,
interleavelists = snd . foldr insertAtDistance (0, [])
where
insertAtDistance xs (d, ys) = (d+1, helper d xs ys)
helper _ [] ws = ws
helper k (b:bs) cs = b : us ++ helper k bs vs
where
(us,vs) = splitAt k cs

这不是很漂亮,如果列表的长度不同,将产生可能不是所需的输出。但是,如果列表都具有相同的长度,它就可以完成工作。

关于list - 在 Haskell 中交错列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14186433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com