gpt4 book ai didi

list - Haskell-将两个列表放入一个元组列表中

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

我正在尝试实现一个函数(如下所述),它需要两个列表(每个或两个都可能是无限的)并返回列表之间所有可能的元素对的元组列表

zipInf :: [a] -> [b] -> [(a,b)]

(例如输出应该是这样的,但不必完全像这样)
zipInf [0 .. 2] ['A' .. 'C'] ~> [(0,'A'),(1,'A'),(0,'B'),(1,'B'),(0,'C'),(2,'A'),(2,'B'),(1,'C'),(2,'C')]

zipInf [] [0 ..] ~> []

zipInf [0 ..] [] ~> []

take 9 (zipInf ['A'] [0 .. ]) ~> [('A',0),('A',1),('A',2),('A',3),('A',4),('A',5),('A',6),('A',7),('A',8)]

我已经开始像这样实现它:
zipInf :: [a] -> [b] -> [(a,b)]
zipInf [] _ = []
zipInf _ [] = []
zipInf

我想将列表提供给辅助函数以生成列表,但我制作的列表无法编译并且不知道如何处理无限列表

辅助功能-
oneList :: [a] -> [b] [(a,b)]
oneList [] _ = []
oneList x:xs y:ys = [(x,y)] ++ oneList

最佳答案

这是一个很棒的练习!

如果我们将您的输入对布置在一个无限表中:

(0,A)  (1,A)  (2,A)  (3,A) ...
(0,B) (1,B) (2,B) (3,B) ...
(0,C) (1,C) (2,C) (3,C) ...
(0,D) (1,D) (2,D) (3,D) ...
...

诀窍是以向上的对角线横穿表格。用眼睛追踪 table 。这张表的条纹是:
(0,A)
(0,B) (1,A)
(0,C) (1,B) (2,A)
(0,D) (1,C) (2,B) (3,A)
...

所有条纹都是有限的,但表格的每个元素都在其中一个中,因此如果将它们连接在一起,每个元素都将出现在连接结果中的有限位置。

这是我建议的游戏计划:

实现 stripes :: [[a]] -> [[a]]它从像上面这样的无限数组中提取条纹列表(首先假设所有列表都是无限的,即不要担心 [] 情况;一旦你有这个工作,纠正它以在可能是有限的列表上工作)。

使用 stripes , 实现 diagonal :: [[a]] -> [a]它连接所有的条纹(这是一个单线)。

最后,通过应用 diagonal 来实现您的功能特定二维表的 [[(a,b)]] ,这是我开始这个答案的表(并且可以使用嵌套列表理解以及其他各种方式构建)。

笔记:
  • 名称 zip 具有误导性。这更像是一个笛卡尔积。
  • 你知道你可以在模式中匹配模式,对吧? IE。如果 f :: [[a]] -> something
    f ((x:xs):xss) = ...

    给你x作为第一行的第一个元素,xs是第一行的其余部分,xss是 table 的其余部分。
  • 关于list - Haskell-将两个列表放入一个元组列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15792912/

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