List Haskell以不同的索引将两个列表的元素组合起来';s

List Haskell以不同的索引将两个列表的元素组合起来';s,list,haskell,functional-programming,combinations,List,Haskell,Functional Programming,Combinations,为这个糟糕的标题道歉,我不太确定如何用语言来描述它,但这就是我的意思。如果你知道更好的表达方式,请让我知道 假设我有两个相同长度的列表 [a, b, c] [x, y, z] 我想创建列表 [[a, y, z], [b, x, z], [c, x, y]] 基本上,对于list1的每个元素,我希望将位于不同索引的2个元素与list2中的第一个元素相关联 因此,对于索引0处的“a”,其他2个在索引1处为“y”,在索引2处为“z” 我很确定我知道如何使用索引,但是我知道这不是很有效,我想看看是否

为这个糟糕的标题道歉,我不太确定如何用语言来描述它,但这就是我的意思。如果你知道更好的表达方式,请让我知道

假设我有两个相同长度的列表

[a, b, c] [x, y, z]
我想创建列表

[[a, y, z], [b, x, z], [c, x, y]]
基本上,对于list1的每个元素,我希望将位于不同索引的2个元素与list2中的第一个元素相关联

因此,对于索引0处的“a”,其他2个在索引1处为“y”,在索引2处为“z”

我很确定我知道如何使用索引,但是我知道这不是很有效,我想看看是否有一个更实用的解决方案


谢谢。

我会用拉链拉。这是我写在很多项目中的一个函数,我已经记住了:

zippers :: [a] -> [([a], a, [a])]
zippers = go [] where
    go b [] = []
    go b (h:e) = (b, h, e) : go (h:b) e
(这实际上返回的信息比我们在技术上需要的要多一些。但这是一种通用形式——在许多情况下非常有用,因为受限版本只返回前缀/后缀对,而忽略了当前焦点,有时还不够。)

有了这个工具,我们就可以将一个列表中的值与另一个列表中的值合并在一起

combine :: [a] -> [a] -> [[a]]
combine xs ys = zipWith (\x (b, h, e) -> reverse b ++ [x] ++ e) xs (zippers ys)
在ghci中试用:

> combine "abc" "xyz"
["ayz","xbz","xyc"]

我会用拉链。这是我写在很多项目中的一个函数,我已经记住了:

zippers :: [a] -> [([a], a, [a])]
zippers = go [] where
    go b [] = []
    go b (h:e) = (b, h, e) : go (h:b) e
(这实际上返回的信息比我们在技术上需要的要多一些。但这是一种通用形式——在许多情况下非常有用,因为受限版本只返回前缀/后缀对,而忽略了当前焦点,有时还不够。)

有了这个工具,我们就可以将一个列表中的值与另一个列表中的值合并在一起

combine :: [a] -> [a] -> [[a]]
combine xs ys = zipWith (\x (b, h, e) -> reverse b ++ [x] ++ e) xs (zippers ys)
在ghci中试用:

> combine "abc" "xyz"
["ayz","xbz","xyc"]
您可以尝试以下方法:

\xs ys->zipWith3((++.)。(:)xs(init$inits ys)(tail$tails ys)
您可以尝试以下方法:

\xs ys->zipWith3((++.)。(:)xs(init$inits ys)(tail$tails ys)

您没有描述任何边缘情况,但您可以通过以下方式获得所需的基本行为:

导入数据列表(初始、尾部)
组合::[a]->[a]->[[a]]
联合收割机xs ys=zipWith3 go xs(尾部ys)(初始ys)
哪里
转到a(uxs:xs)ys=a:ys++xs
开始

关键是
tails
返回其列表中以完整列表开始的连续后缀,
inits
返回以空列表开始的连续前缀。

您没有描述任何边缘情况,但您可以通过以下方式获得所需的基本行为:

导入数据列表(初始、尾部)
组合::[a]->[a]->[[a]]
联合收割机xs ys=zipWith3 go xs(尾部ys)(初始ys)
哪里
转到a(uxs:xs)ys=a:ys++xs
开始

关键是
tails
返回其列表中以完整列表开头的连续后缀,
inits
返回以空列表开头的连续前缀。

这对长度大于3的列表有效吗?当然!如果您关心的是
zipWith3
中的“3”,那么这与列表的长度无关。正如我所说,有很多边缘情况你没有指定,例如,当列表的长度不一样时会发生什么?这个函数不会出错,但是你可以使用它来获得你想要的行为。对于这个函数,当我使用它时,我通过它的两个数组是彼此的变体,因此它们的大小总是相同的,如果它们以前是空的,我会明白这对长度大于3的列表有效吗?当然!如果您关心的是
zipWith3
中的“3”,那么这与列表的长度无关。正如我所说,有很多边缘情况你没有指定,例如,当列表的长度不一样时会发生什么?此函数不会出错或发生任何事情,但您可以使用它来获得所需的行为。对于此函数,当我使用它时,通过它的两个数组是彼此的变体,因此它们的大小始终相同,如果它们以前是空的,我会明白当列表的长度大于3@SamTaaghol试试看!当列表的长度大于3@SamTaaghol试试看!