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

在Haskell的列表中寻找最短的列表

陶腾
2023-03-14

我在使用Haskell编写的程序中遇到了一些困难。其背后的思想是递归地在一个列表中找到最短的列表并返回该列表。我已经设法把程序写得很好,但我似乎不知道我在其中做错了什么。这些是我尝试编译时得到的错误:

  • 无法将类型“a”与“[[a]]”匹配,“a”是一个严格的类型变量,由类型签名绑定的类型为:seltest::forall a。短时间内。HS:1:13。预期类型:[[[a]]],实际类型:[a]
  • 在“最短”的第一个论元中,即“y”。在'(:)'的第一个参数中,即最短的y。在表达式:最短y:[list]
  • 相关绑定包括列表::[[a]](绑定在shortest.hs:4:15)、y::[a](绑定在shortest.hs:4:13)、x::[a](绑定在shortest.hs:4:11)、最短::[[a]]->[a](绑定在shortest.hs:2:1)。

下面是我使用的代码:

shortest :: [[a]] -> [a]
shortest [] = []
shortest [y] = y
shortest (x:y:list)
   | length x > length y = shortest y:[list]
   | otherwise = shortest x:[list]

共有1个答案

梁鸣
2023-03-14

列表已经是输入的尾部;您不需要(也不应该)将其包装在另一个列表中。

shortest (x:y:list) = shortest $ (if length x > length y then y else x) : list

在每一步中,问题只是从递归调用的输入中移除哪个元素XY

另一种不需要两个基本情况的方法是只将列表的头部与尾部的递归结果进行比较。

shortest [] = []
shortest (x:xs) = let s = shortest xs
                  in if length s < length x then s else x
shortest = snd . minimum . map (\x -> (length x, x))
import Data.Semigroup
shortest xs = x where Arg _ x = minimum [Arg (length x) x | x <- xs]
 类似资料:
  • 问题内容: 这似乎是一个非常简单的问题,但是我正在寻找一种尚可理解的简短而甜蜜的方法(这不是代码高尔夫)。 给定一个字符串列表,找到最短字符串的最简单方法是什么? 对我来说最明显的方式大致是: 但这似乎是很多解决此问题的代码(至少在python中)。 问题答案: 该函数具有一个可选参数,可让您指定一个函数来确定每个项目的“排序值”。我们只是需要将其设置为的功能来获得最短的价值:

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

  • 问题内容: 我有以下格式的多维列表: 如何获得所有子列表的第三个值的最大值。用伪代码: 我知道这可以通过遍历列表并将第三个值提取到新列表中,然后简单地执行来完成,但是我想知道是否可以使用lambda或列表理解来完成? 问题答案: 只需与生成器表达式一起使用: 另外,不要命名您的变量,而是要隐藏类型。

  • 我有一个100个随机整数的列表。每个随机整数都有一个从0到99的值。重复是允许的,所以列表可以是这样的 我需要找到最小的整数( 我最初的解决方案是这样的: 但这需要一个用于记账的辅助数组和第二次(可能是完整的)列表迭代。我需要执行这个任务数百万次(实际应用程序是在贪婪的图形着色算法中,我需要用顶点邻接列表找到最小的未使用颜色值),所以我想知道是否有一种聪明的方法可以在没有太多开销的情况下获得相同的

  • 问题内容: 我明白 将导出列表中最常见的元素 但是如何在不使用辅助函数的情况下导出列表列表中最常见的元素? 例如 输出应等于。 当我尝试 它写道 谁能帮帮我吗? 问题答案: 有很多方法,但是我想让您知道,标准模块中有一些用于这类事情的好工具,例如: 或者,您可以(有点)将当前解决方案用于每个子列表:

  • 假设我有3个要关闭的Scanner实例。 我可以做 对于每个扫描仪。 或者我可以做类似的事情 使用Java8有没有更简单的方法? 类似的东西?