Haskell:删除最大的列表

2024-03-31

我有一个列表列表,以及一个返回包含最多项目的列表的函数:

extract ::[Plateau]->Plateau

extract(x:xs) 
  |x==maximumBy(compare `on` length)(x:xs)=x 
  |otherwise = extract(xs)
extract []=[""]

现在我需要一个函数来获取相同的结果[Plateau]并返回一个新的[Plateau]删除了之前最大的:

prune::[Plateau]->[Plateau]
prune(x:xs)
  |x < (maximumBy(compare `on` length)(x:xs)=x : prune (xs)
  |x>=maximumBy(compare `on` length)(x:xs)=[]
prune [] = [] 

我也称修剪为sortBy确保最大的列表位于最后:

(extract . prune) (sortBy(compare `on` length)(plateaus))

这开始可以正常工作。我的列表plateaus好像:

plateaus = ["01000"], ["01010", "11010", "10010"] ["00101"], ["01101", "01001"]]

这里是排序的:

 [["01000"], ["00101"], ["01101", "01001"], ["01010", "11010", "10010"]]

现在,我的函数 prune 返回一个列表

[["01000"], ["00101"]]

这告诉我,出于某种原因,哈斯克尔认为

["01101", "01001"] >= ["01010", "11010", "10010"]

当我可以清楚地看到 2 >= 3 不成立时。

为什么是这样?


像这样的事情可能是一个更简单的选择,也许:

prune :: [Plateau] -> [Plateau]
prune s@(w:x:xs) = filter ( /= maxplateau ) s
    where maxplateau = maximumBy (compare `on` length) s
prune _ = []

这依赖于 Haskell 的几个不错的部分。

第一个是模式匹配 - 您在问题和上一个问题中使用了它 - 在这里,我更进一步,要求一个至少包含两个元素的列表,w and x。这允许失败案例处理空列表和单条目列表案例,这应该(基于您提供的代码)导致相同的结果:一个空列表。

第二种是使用@符号,又名作为模式 http://en.wikibooks.org/wiki/Haskell/Pattern_matching#As-patterns。我在回答你之前的问题时向你展示了这一点。虽然只是语法糖,而不是必需的,但它可以使代码更具可读性。

第三种是柯里化,有时称为“偏函数应用”。就我而言,我使用了什么学习 Haskell http://learnyouahaskell.com/ calls 使用节的中缀函数的部分应用 http://learnyouahaskell.com/higher-order-functions#curried-functions(你应该阅读整个部分 - 非常有形成性,很好地解决了 Haskell 语言的支柱问题(事实上,如果你真的喜欢或想要初学者很好地掌握 Haskell,我会阅读《Learn you a Haskell》封面覆盖,因为它太棒了))。无论如何,这就是我正在使用的( /= maxplateau );通常,中缀函数/=接受两个相同类型的参数,并返回一个Bool- 通过用括号括起来并在一侧提供表达式,我已经部分应用了它。这产生了一个函数Plateau参数,非常适合提供给列表上的过滤函数Plateaus.

最后,在我的编辑中,我稍微改变了我的答案以使用where关键词。我这样做只是为了让部分应用更清晰一些。我鼓励您阅读更多有关where in the 其中部分 http://learnyouahaskell.com/syntax-in-functions#where学习 Haskell(你能看出我有偏见吗?:^))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell:删除最大的列表 的相关文章

  • 将两个 Int 值相除以获得 Float 的正确方法是什么?

    我想分两份IntHaskell 中的值并获得结果Float 我尝试这样做 foo Int gt Int gt Float foo a b fromRational a b 但 GHC 版本 6 12 1 告诉我 无法将预期类型 Intege
  • Python range() 和 zip() 对象类型

    我了解功能如何range and zip 可以在 for 循环中使用 然而我期望range 输出一个列表 很像seq在 Unix shell 中 如果我运行以下代码 a range 10 print a 输出是range 10 表明它不是一
  • 如何在 Haskell 中安装库?

    我尝试使用控制 Monad Extra andM https hackage haskell org package extra 1 7 10 docs Control Monad Extra html import Control Mon
  • Haskell 中的中缀运算符优先级

    对于以下 Haskell 表达式 返回 a gt gt f 应该读作 返回a gt gt f or 返回 a gt gt f 这里的相关规则是什么 规则始终是函数应用程序的优先级高于任何运算符 因此 return a gt gt f 被解析
  • 属性错误:“列表”对象没有属性“拆分”

    我正在尝试读取一个文件并用逗号分隔每行中的一个单元格 然后仅显示第一个和第二个单元格 其中包含有关纬度和经度的信息 这是文件 time 纬度 经度 类型2015 03 20T10 20 35 890Z 38 8221664 122 7649
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • Python 将列表追加到列表中

    我正在尝试编写一个通过矩阵的函数 当满足条件时 它会记住该位置 我从一个空列表开始 locations 当函数遍历行时 我使用以下方法附加坐标 locations append x locations append y 函数末尾的列表如下所
  • R:ifelse 中的字符串列表

    我正在寻找与 MySQL 中的 where var in 语句类似的东西 我的代码如下 data lt data frame id 10001 10030 cc1 rep c a b c 10 attach data data new lt
  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • 有没有更好的方法将 UTC 时间转换为大纪元时间?

    我想将文件的修改时间设置为从 exif 数据获取的时间 为了从 exif 获取时间 我发现 Graphics Exif getTag Exif gt String gt IO Maybe String 要设置文件修改时间 我发现 Syste
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • 在 monad 转换器类型类中使用列表 monad?

    我的目标是创建一个在 ReaderT WriterT 堆栈或 RWS 堆栈中使用列表 monad 的函数 更一般地说 如何在 mtl 类型类 例如 MonadReader MonadWriter 中使用列表 monad 我为什么要尝试这样做
  • Haskell 标准库是什么?

    GHC专用库可以称为标准库吗 或者只有 Haskell 2010 报告中的那些才算数 许多 GHC 库可以通过 Haskell 报告中的函数来实现 可能与 C 绑定相结合 但其他语言依赖于 GHC 特定的扩展 因为语言报告中定义的当前 Ha
  • 使用 LINQ 通过一个属性比较两个列表

    假设我有以下内容 class Widget1 public int TypeID get set public string Color get set class Widget2 public int TypeID get set pub
  • 在 Django 模板中使用 forloop.counter 值作为列表索引

    在我的 Django 1 1 1 应用程序中 我在视图中有一个函数 它向模板返回一系列数字和项目列表列表 例如 data item1 item2 item3 item4 item5 item6 item7 item8 item9 retur
  • 如何通过“cabal build”或“stack build”构建带有图标的项目

    我想构建一个带有图标的可执行文件 通过谷歌搜索 我发现这里的说明 https wiki haskell org Setting an executable icon 但它只能通过编译源文件来工作ghc 如果我想构建一个具有可执行文件的项目c
  • Data.Sequence 中的 inits 和 tails 如何工作?

    Louis Wasserman 编写了当前的实现inits and tails in Data Sequence 他表示它们非常高效 事实上 只要查看代码 我就可以看到 无论它们在做什么 它们都是以干净 自上而下的方式进行的 这往往会给惰性
  • 检查对以下内容的理解:“变量”与“变量” “价值”、“功能”与“抽象”

    这个问题是后续问题this one https stackoverflow com questions 25327705 is function a sort of variable 25329157 25329157在学习 Haskell

随机推荐