当前位置: 首页 > 知识库问答 >
问题:

在Haskell中交错列表

壤驷文华
2023-03-14

我想知道如何在Haskell中编写一个函数,将一个列表交织成单个列表,例如,如果我有一个名为

共有1个答案

柏阳炎
2023-03-14

编写它的最快方法是使用transposefromdata.list

import Data.List

interleavelists :: [[a]] -> [a]
interleavelists = concat . transpose

transpose选择其参数的每个非空列表中的第一个元素,将它们放入一个列表中,然后transpose转置参数的元素tail列表。concat执行transpose结果的列表时,会根据需要将列表交织在一起。如果某些元素列表是无限的,那么它可以工作,但是如果列表本身有无限多的元素,那么它当然永远不会超过head的列表。但无论如何处理那个案子都是有问题的。

使用foldr交错列表并不简单。假设你有

interleavelists xss = foldr something zero xss
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

这并不是很漂亮,如果列表的长度不完全相同,那么将产生可能不是所需的输出。但是如果列表都有相同的长度,它就完成了任务。

 类似资料:
  • 我在使用Haskell编写的程序中遇到了一些困难。其背后的思想是递归地在一个列表中找到最短的列表并返回该列表。我已经设法把程序写得很好,但我似乎不知道我在其中做错了什么。这些是我尝试编译时得到的错误: 无法将类型“a”与“[[a]]”匹配,“a”是一个严格的类型变量,由类型签名绑定的类型为:seltest::forall a。短时间内。HS:1:13。预期类型:[[[a]]],实际类型:[a] 在

  • 我一直在学习Haskell,我做了一些统计函数,这些函数可以用于或类型的列表 以下是两个示例: 然而,我现在想知道我是否可以通过以不同的方式编写来改进运行时。像这样: 或者像这样: 我不知道哈斯克尔在屏幕后面是怎么处理的。在原始版本中,计算机是否为中的每个条目计算?我想Haskell不会在背景中优化理解。我错了吗?

  • 我试图编写一个递归函数,它将包含整数列表的列表作为输入,并返回类型为([Int],Int]的元组。([Int],Int) 这是为“棋盘游戏”提供的,其中提供了一个棋盘: 这将是一个4行5列的电路板。列表中的数字是“硬币价值”。这个棋盘游戏的目标是从列表的顶部到底部收集硬币。你可以从最上面一排的任何位置开始,然后向下移动,你可以直接向下移动,也可以对角向左或向右移动。你需要的路径将为你提供最大的总硬

  • 问题内容: 我有一个带有坐标的MySQL表,列名称为X和Y。现在我想交换此表中的列值,以使X成为Y,Y成为X。最明显的解决方案是重命名列,但是我不想进行结构更改,因为我不一定有这样做的权限。 这可能以某种方式与 UPDATE 有关吗? UPDATE表SET X = Y,Y = X 显然不会满足我的要求。 编辑:请注意,我上面提到的权限限制有效地阻止了ALTER TABLE或其他更改表/数据库结构的

  • HList是共感的吗?如果是,一个共感类型如何包含有限值? 如果我们定义呢?这会被认为是什么和/或它会比有用吗?

  • 代码假设返回树中从根到叶的每条路径的列表,顺序从左到右。具有一个子节点(一个子节点(一个子节点)和一个子节点(一个子节点)不被视为叶节点。 我试着像这样编码 但返回的路径似乎包括具有一个子节点的节点。这将导致类似于