Haskell 生成预过滤排列

2024-04-02

有没有办法生成预过滤的排列,而不是这样做:

filter condition $ permutations list

排列函数可以短路。例如 :

perms [] = [[]]
perms xs = [ i:j | i <- xs, j <- perms $ delete i xs]

我尝试了一些明显的事情,例如:

perms xs = [ i:j | i <- xs, j <- filter condition $ perms $ delete i xs]

我以为会发生什么,这会引发一条链条,最终会到达[]然后继续工作,但一路过滤。然而,当给它提供一个很长的列表时,从而加快这个过程。这似乎不会发生,因为当尝试对 20 个项目列表进行排列时,它陷入了困境(ghci),而该列表实际上只有很少的实际过滤排列。


将其编码为do递归表示法非常简单。

foo :: ([a] -> Bool) -> [a] -> [[a]]
foo p xs = bar ([],xs)
   where
   bar (acc,[]) = return acc
   bar (acc,xs) = do
                   (x,ys) <- picks xs      -- shrink the domain (ys)
                   if ( p (x:acc) )        -- test soon
                     then bar (x:acc,ys)   -- loop
                     else mzero            -- fail early

picks [] = []
picks (x : xs) = (x, xs) : [(y, x : ys) | (y, ys) <- picks xs]

picks来自这个答案 https://stackoverflow.com/questions/12869097/splitting-list-into-a-list-of-possible-tuples/12872133#12872133.

Testing:

> foo (const True) [1..3]
[[3,2,1],[2,3,1],[3,1,2],[1,3,2],[2,1,3],[1,2,3]]

> foo (\(x:xs) -> not(null xs) || x > 1) [1..3]
[[3,1,2],[1,3,2],[2,1,3],[1,2,3]]

最后一个也立即开始产生输出[1..20], [1..300] etc.

我相信这可以用更高层次的东西来清楚地表达。

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

Haskell 生成预过滤排列 的相关文章

  • 在 Haskell/Yampa 和 HOOD 中调试游戏对象的输出

    我一直坚持使用 Haskell Yampa Arrows with HOOD 为我的游戏对象生成调试输出 我的引擎基本上运行一系列游戏对象 这些对象产生输出状态 线 圆 然后进行渲染 data Output Circle Position2
  • 不分配内存的重复排列

    我正在寻找一种算法来生成列表中重复 4 个元素 长度 2 1000 的所有排列 Java实现 http en literateprograms org Permutations with repetition 28Java 29 问题是上面
  • 为什么这个记忆器适用于递归函数?

    我不明白为什么下面的代码是这样的fib以线性而非指数时间运行 def memoize obj Memoization decorator from PythonDecoratorLibrary Ignores kwargs cache ob
  • 如何在 Windows 7 中配置 cabal?

    我已经在Windows 7中安装了Haskell Platform 2012 我在控制台中编写cabal update我收到消息说有新版本的阴谋集团 我写的cabal install cabal install 安装完成后 它告诉我 cab
  • unsafeInterleaveIO 什么时候不安全?

    与其他不安全 操作不同 文档 http hackage haskell org packages archive base latest doc html System IO Unsafe html v unsafeInterleaveIO
  • 在 Windows 上使用堆栈安装 SDL2 for Haskell

    我正在尝试将 SDL2 与堆栈一起使用 我跟着这些说明 https www reddit com r haskellgamedev comments 4jpthu windows sdl2 is now almost painless vi
  • 在 Haskell 中提升 State monad 中的值

    我正在 Haskell 中编写一个数独生成器 求解器作为学习练习 My solve函数接受一个UArray但返回一个State Int UArray 这样它也可以返回解决问题时发现的最大难度级别 到目前为止 这是我的功能 仍处于实验性的早期
  • 让 GHC 生成“带进位加法 (ADC)”指令

    下面的代码将表示 192 位数字的两个未装箱字三元组添加到新的未装箱字三元组中 并且还返回任何溢出 LANGUAGE MagicHash LANGUAGE UnboxedTuples import GHC Prim plusWord2 Wo
  • 使用 cabal new-install 重新安装相同版本的软件包

    我正在开发 Haskell 包 我还没有上传到Hackage 版本号是0 1 0 0 我正在使用新风格的 Cabal 命令 为了在我处理包的同时测试它 使库可用于测试项目 我运行cabal new install lib构建包后 然而 我注
  • 使用通用元组函数一次进行多次折叠

    如何编写一个接受类型函数元组的函数ai gt b gt ai并返回一个函数 该函数接受类型元素的元组ai 类型的一个元素b 并将每个元素组合成一个新的元组ai 那是签名应该是这样的 f a1 gt b gt a1 a2 gt b gt a2
  • 函数式编程是否需要新的命名约定?

    我最近开始使用 Haskell 学习函数式编程 并在 Haskell 官方 wiki 上发现了这篇文章 如何阅读哈斯克尔 http www haskell org haskellwiki How to read Haskell What t
  • 用parsec解析递归数据

    import Data Attoparsec Text Lazy import Data Text Lazy Internal Text import Data Text Lazy pack data List a Nil Cons a L
  • 我可以获得有关过度限制类型签名的警告吗?

    当我为可能更具多态性的函数提供类型签名时 GHC 或某些 lint 工具可以告诉我吗 GHC 不这样做 快速搜索 Hackage 也没有发现任何结果 实现这样的事情的一个简单但可能非常有效的方法是在 GHCi 中加载模块 使用 browse
  • 如何使用 Haskell 中的 thyme 库从 Int 值创建 UTCTime?

    我有年 月 日 小时和分钟值 所有这些都是类型Int 我怎样才能将它们转换为UTCTime or UniversalTime 需要导入以下内容 import Control Lens import Data Thyme Clock impo
  • 通过 Emacs 评估 ghci 或 Hugs 中的缓冲区

    在 Emacs 中使用 sml mode 我已经能够使用以下命令将缓冲区内容直接发送到较差的 SML 进程C c C b 现在我只想用 Haskell 做同样的事情 Haskell 模式似乎不支持这一点 所以我想知道 使用 Emacs 和
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • 具有精确 k 次反转的排列数

    Let A a1 a2 an 是整数的排列1 2 n 一对索引 i j where 1 lt i lt j lt n 是排列的逆A if ai gt aj 我们给定整数n gt 0 and k gt 0 n 元素排列到底包含多少个k反转 这
  • 使用 nix 在 Mac OS X 上由于“架构 x86_64 的未定义符号”而导致“堆栈构建”失败

    首先是错误消息 stack build Linking Users yuzhao stack setup exe cache x86 64 osx tmp Cabal simple mPHDZzAJ 2 2 0 1 ghc 8 4 4 cl
  • 在 Clojure 中退出 Recur 循环

    我想跳出下面的循环 并在第 10 行计算结果为 true 时返回最佳最小移动 我查看了 print 语句的输出 当第 10 行的计算结果为 true 时 它 找到了我正在查找的数据 但仍然重复出现 在 Clojure 中 有没有办法在语句计
  • 导入 Haskell 模块

    我是哈斯克尔的新手 为什么当我尝试使用时Days from Data Time我收到此错误 Could not find module Data Time It is a member of the hidden package time

随机推荐

  • 在C#中优化多重调度通知算法?

    抱歉 我想不出更好的方法来描述这个问题 基本上 我正在尝试在游戏中实现碰撞系统 我希望能够注册一个 碰撞处理程序 来处理可以转换为特定类型的两个对象 以任一顺序给出 的任何碰撞 因此 如果Player Ship Entity and Las
  • 在 MATLAB 中翻转 y 轴

    有没有办法在matlab图中将y轴颠倒 使y轴的正方向而不是向上 指向下 我求求你了 请不要说 打印出来 然后把纸翻过来 The YDir 轴属性 https www mathworks com help matlab ref axes p
  • mysqldump 命令的 Windows 批处理文件

    这是我第一次制作 Windows 批处理文件 我不想先做实验 因为它与实时服务器相关 我用以下方式备份 mySql 数据库 打开命令提示符 写 mysqldump u user p DBname gt C DBname sql 然后cmd询
  • 是否可以从特定参数继承文档?

    Visual Studio 2017 ReSharper 2017 C 项目 我试图通过使用继承方法参数的文档select属性 但它似乎没有按预期工作 根据这篇文章 http tunnelvisionlabs github io SHFB
  • 如何查询5米范围内的所有数据?

    我正在使用 GeoDjango 和 PostGIS 然后我遇到了如何查询我的 postgres db 表以获取 5 米距离内的所有数据的麻烦 UPDATES1我正在使用 GeoDjango 1 2 7 我从这个网址找到了一些东西https
  • 使用 JAXB Marshaller 处理 XML 转义字符(例如引号)

    我需要使用 JAXB Marshaller JAXB 版本 2 2 将 XML java 对象序列化为 XML 文件 现在在 xml 对象中 我有一个标签 其中包含字符串值这样 lt tagA gt lt YYYYY gt done lt
  • ASP.NET Web 服务错误地返回 XML 而不是 JSON

    我正在尝试使用 jQuery 从 javascript 使用 ASMX Web 服务 当我要求 XML 时它工作得很好 但我想利用 net 的 JSON 序列化功能 这也开始让我烦恼 这不起作用 Web 服务的代码 using System
  • 像 Javascript“Math.round()”那样的 Pythonic 方式“r​​ound()”?

    我想要最 Pythonic 的方式来舍入数字 就像 Javascript 那样 通过Math round 它们实际上略有不同 但这种差异会对我的应用程序产生巨大的影响 Using round Python 3 中的方法 Returns th
  • 如何在 codeigniter 中使用 .htaccess 限制图像文件夹

    我有包含图像文件夹的 codeigniter 项目 我想让它无法通过直接 url 访问假设有人输入 url http localhost project images Pricelistupdated pdf 然后它将直接在浏览器选项卡中打
  • 课堂上的自定义事件

    我需要从类启动自定义事件 我知道用 DOM 对象和 jquery 来做到这一点 使用triggerHandler 比如 object triggerHandler inputChange param X 问题是当我在一个类中尝试这个时 如下
  • 如何以编程方式使用 ical 从重复集中删除单个事件?

    我在 10 11 日创建了一个重复事件 请参见下文 我想删除第 10 个事件 因此我使用了方法 取消 但由于 UID 相同 两条记录都将被删除 如何只删除一条记录 我应该使用任何其他值 例如 UID 吗 BEGIN VCALENDAR PR
  • XML 格式错误

    我有一个 php 脚本 用于将 xml 数据写入文件 另一个脚本将该文件的内容作为响应发送到客户端 但在客户端 我收到以下错误 XML 解析错误 格式不正确当我查看页面源时 我看到的 XML 如下
  • 制作多个文件强制下载

    抱歉 如果标题没有解释太多 让我尝试进一步解释 我的代码如下所示
  • 传单地图中奇怪的默认尺寸

    我已经拍摄了一张可用的 Leaflet 地图 但是当我添加 JQuery Mobile 标题和后退按钮时 格式变得疯狂 最初加载页面时 所有内容都加载在左上角 但是当页面在桌面上调整到最小大小或在移动设备上旋转时 一切都很好 这是打开后的样
  • 自定义类排序:没有抛出错误,Python 测试的目的是什么?

    在不指定对象的相等比较属性的情况下 Python在使用时仍然在做一些事情 gt and lt 如果您不指定 Python 实际上是通过什么来比较这些对象的 gt or lt 我预计这里会出现不受支持的操作数错误 就像在尝试将两个对象添加在一
  • 以编程方式修复 IE 中的浏览器模式

    我有一个网站完全兼容所有浏览器 包括 IE 7 至 9 当我在 IE 10 上尝试时 我感到很震惊 错误太多 而且因为我没有时间为 IE 10 修复这个问题 而且我也在使用第三方控件 Telerik 所以我决定尝试一个简单的解决方案 文档和
  • 返回具有单个元素的数组或列表时的列表或标量上下文

    我有一个函数func可以返回单个值或值列表 具体取决于函数的调用方式 因此 对于这个特定的函数 调用者会知道何时只期望一个返回值 因此希望使用更简单的语法my var func 代替my var func 问题是 在某些情况下 单个值会转换
  • 隐藏“水平”滚动条但仍然可以滚动

    我需要一些帮助来隐藏水平滚动条并仍然能够滚动 我使用过 webkit 但在 IE 和 Firefox 中不起作用 我见过很多有关垂直滚动条的帮助 但不适用于水平滚动条 有什么帮助吗 更新 我创建了一个 JSFiddle 来展示我的问题 我想
  • 如何设计一个带有可选参数的 RESTful URL 进行搜索?

    如果我必须在 RESTful Web 服务中创建一个 URL 我的客户将使用该 URL 按字段搜索所有企业 其中字段是可选的 那么该 URL 会是什么样子 可以仅通过名称 姓名和电话号码或姓名 电话号码和联系电子邮件来搜索企业 钱德鲁 将所
  • Haskell 生成预过滤排列

    有没有办法生成预过滤的排列 而不是这样做 filter condition permutations list 排列函数可以短路 例如 perms perms xs i j i lt xs j lt perms delete i xs 我尝