在 Haskell 中使用填充进行压缩

2023-11-27

有几次我发现自己想要一个zip在 Haskell 中,它会向较短的列表添加填充,而不是截断较长的列表。这很容易写。 (Monoid在这里对我有用,但您也可以只传递要用于填充的元素。)

zipPad :: (Monoid a, Monoid b) => [a] -> [b] -> [(a, b)]
zipPad xs [] = zip xs (repeat mempty)
zipPad [] ys = zip (repeat mempty) ys
zipPad (x:xs) (y:ys) = (x, y) : zipPad xs ys

当尝试定义时,这种方法会变得丑陋zipPad3。我输入了以下内容,然后意识到它当然不起作用:

zipPad3 :: (Monoid a, Monoid b, Monoid c) => [a] -> [b] -> [c] -> [(a, b, c)]
zipPad3 xs [] [] = zip3 xs (repeat mempty) (repeat mempty)
zipPad3 [] ys [] = zip3 (repeat mempty) ys (repeat mempty)
zipPad3 [] [] zs = zip3 (repeat mempty) (repeat mempty) zs
zipPad3 xs ys [] = zip3 xs ys (repeat mempty)
zipPad3 xs [] zs = zip3 xs (repeat mempty) zs
zipPad3 [] ys zs = zip3 (repeat mempty) ys zs
zipPad3 (x:xs) (y:ys) (z:zs) = (x, y, z) : zipPad3 xs ys zs

此时我作弊并只是使用length选择最长的列表并填充其他列表。

我是否忽略了一种更优雅的方式来做到这一点,或者是类似的zipPad3已经在某处定义了?


定制怎么样head and tail函数(命名为next and rest在我下面的例子中)?

import Data.Monoid

zipPad :: (Monoid a, Monoid b) => [a] -> [b] -> [(a,b)]
zipPad [] [] = []
zipPad xs ys = (next xs, next ys) : zipPad (rest xs) (rest ys)

zipPad3 :: (Monoid a, Monoid b, Monoid c) => [a] -> [b] -> [c] -> [(a,b,c)]
zipPad3 [] [] [] = []
zipPad3 xs ys zs = (next xs, next ys, next zs) : zipPad3 (rest xs) (rest ys) (rest zs)

next :: (Monoid a) => [a] -> a
next [] = mempty
next xs = head xs

rest :: (Monoid a) => [a] -> [a]
rest [] = []
rest xs = tail xs

测试片段:

instance Monoid Int where
  mempty = 0
  mappend = (+)

main = do
  print $ zipPad [1,2,3,4 :: Int] [1,2 :: Int]
  print $ zipPad3 [1,2,3,4 :: Int] [9 :: Int] [1,2 :: Int]

其输出:

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

在 Haskell 中使用填充进行压缩 的相关文章

  • 如何打乱列表?

    如何从一组数字 1 2 3 直到我击中x 我的计划是重新调整列表 1 2 3 并把它砍在x chopAt 3 2 3 1 2 3 chopAt 3 2 1 3 2 1 3 chopAt 3 3 1 2 3 chopAt chopAt x y
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出
  • 你能在 scala 中使用 varargs 柯里化一个函数吗?

    我正在考虑如何用可变参数柯里化一种方法 然后我意识到我什至不知道如何去做 理想情况下 它应该让您可以随时开始使用它 然后以可迭代结束 def concat strs String strs mkString val curriedConca
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • 你为什么决定“反对”使用 Erlang?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 你是否真的 尝试过 意味着在其中编程 而不仅仅是阅读有关它的文章 Erlang并决定在项目中不
  • Haskell:需要了解 Functor 的签名

    有人能给我解释一下 Functor 的签名吗 Prelude gt info Functor class Functor f gt where fmap a gt b gt f a gt f b lt a gt f b gt f a 我不明
  • 在 Haskell 中将字符串转换为整数/浮点数?

    data GroceryItem CartItem ItemName Price Quantity StockItem ItemName Price Quantity makeGroceryItem String gt Float gt I
  • 如何在 Haskell Pipes 中将两个 Consumer 合并为一个?

    我使用Haskell流处理库pipes https hackage haskell org package pipes编写一个命令行工具 每个命令行操作都可以将结果输出到stdout并记录到stderr with pipes API I n
  • cabal install wx 缺少 C 库

    Env 操作系统 feodra 16 Haskell 平台 wxGTK 开发 GHHC 7 0 4 我正在尝试安装 wxHaskell 阴谋集团安装wx 然后给出这些错误 缺少对外国库的依赖 缺少 C 库 wx baseu 2 8 wx b
  • Data.Array 有多快?

    The 文档 http haskell org ghc docs latest html libraries array 0 3 0 3 Data Array html of Data Array reads Haskell 提供了可索引数
  • Haskell 中的所有内容都存储在 thunk 中吗,甚至是简单的值?

    以下值 表达式 函数的 thunk 在 Haskell 堆中是什么样子的 val 5 is val a pointer to a box containing 5 add x y x y result add 2 val main prin
  • 管道 - 将多个来源/生产者合并为一个

    我正在使用读取文件sourceFile 但我还需要在处理操作中引入随机性 我认为最好的方法是拥有一个这样的制片人 Producer m StdGen ByteString 其中 StdGen 用于生成随机数 我打算让生产者执行 source
  • 某些数据结构是否比其他数据结构更适合函数式编程?

    In 现实世界哈斯克尔 http book realworldhaskell org 有一个标题为 没有数组或哈希表的生活 的部分 其中作者建议在函数式编程中首选列表和树 而在命令式程序中可能会使用数组或哈希表 这是有道理的 因为在创建新列
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • 相当于 Java 中 C++ 的 std::bind 吗?

    有没有一种方法可以像 C 中的 std bind 一样将 Java 中的参数绑定到函数指针 Java 中类似的东西会是什么 void PrintStringInt const char s int n std cout lt lt s lt
  • 为什么我不能声明推断类型?

    我有以下内容 runcount Eq a Num b gt a gt b runcount runcountacc 0 runcountacc Eq a Num b gt b gt a gt b runcountacc n runcount
  • 检索 Haskell 项目中所有导入的列表

    因此 我的最终目标是通过确保项目导入的所有实体都存在于其声称可以使用的版本中 来评估 cabal 文件中依赖项的准确性 一个好的开始是找到单个源文件使用的所有导入实体的列表 可选地包含有关它们来自何处的信息 我愿意暂时忽略类实例的情况 因为
  • 与 Functor 不同,Monad 可以改变形状?

    我一直很喜欢以下关于单子相对于函子的力量的直观解释 单子可以改变形状 函子不能 例如 length fmap f 1 2 3 总是等于3 然而 对于单子来说 length 1 2 3 gt gt g往往不等于3 例如 如果g定义为 g Nu
  • Haskell数据类型转换问题

    我目前正在学习 Haskell 并且一直在编写一些非常简单的程序来练习 我的程序之一是 import System IO main do putStrLn Give me year y lt getLine let res show cal
  • 我可以在 Java 8 中使用 Clojure 函数作为 Lambda 函数吗?

    我在 Clojure 中使用了许多库来生成符合 Clojure lang IFN https github com clojure clojure blob master src jvm clojure lang IFn java 界面 它

随机推荐

  • 删除 Json 中的空格

    如何删除以下代码块中的空格并将其存储在 javascript 变量中 这是原始格式 info First Json description Official Website timestamp 1337936081 rates USD 84
  • neon vuzp 的 sse/avx 等效项

    Intel 的向量扩展 SSE AVX 等为每个元素大小提供两个解包操作 例如SSE 内在函数是 mm unpacklo and mm unpackhi 对于向量中的 4 个元素 它执行以下操作 inputs A0 A1 A2 A3 B0
  • R flexdashboard 删除标题栏

    我正在使用一个项目rMarkdown和flexdashboard包裹来自rStudio 一切都进展顺利 但我想删除您在图像顶部看到的蓝色标题栏 我们将此 html 页面放入一个窗口中 使其成为第二个标题栏 看起来很糟糕 里面有一个函数吗fl
  • 使用 TimeSeriesGenerator 为 Keras LSTM 定制数据生成器

    所以我尝试使用 Keras 适合生成器使用自定义数据生成器将数据输入 LSTM 网络 什么有效 为了说明这个问题 我创建了一个玩具示例 尝试以简单的升序序列预测下一个数字 并使用 Keras时间序列生成器创建一个序列实例 WINDOW LE
  • .NET 是否有相当于 Delphi 的 ActionList 的功能?

    我们目前使用Delphi 5 和Delphi 2005 进行开发 并研究通过Delphi Prism 走 NET 路线 是否有与 Delphi 的 ActionList 等效的 NET 对于那些不熟悉 ActionList 的人来说 它是一
  • 获取 Windows 应用商店应用程序的 .mp3 文件中的 Albumart

    如何获取 mp3 文件中的 AlbumArt 图像 我正在使用 C 开发 Windows 应用商店应用程序 MusicProperties 类给了我专辑名称 艺术家名称与但它不能给我专辑艺术 查看 MSDN 示例以显示任何文件的缩略图 它还
  • EnvironmentVariables默认值长度大于4096

    我正在尝试将 Rails 应用程序部署到 Amazon Elastic Beanstalk eb 环境 我收到了这个错误 Uploading 100 Done 2019 01 24 09 42 16 INFO Environment upd
  • 为什么column = NULL不返回任何行? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 NULL NULL 在 SQL Server 中计算结果为 false 如果生成查询以将数据插入表 MyTab 中的列 Age Sex DOB ID INSERT INTO MyTab VAL
  • 安装 pylinkgrammar 时缺少文件

    http pypi python org pypi pylinkgrammar 我在尝试安装 pylinkgrammar 时遇到错误 Running setup py egg info for package pylinkgrammar I
  • 如何使我的应用程序在 Galaxy Tab 上全屏显示

    我一直在尝试一切我能想到的方法 让我的应用程序在 Galaxy Tab 上全屏显示 基本上 它的工作原理类似于 Android SDK 附带的 Lunar Lander 示例应用程序 您将如何使 Lunar Lander 应用程序在 Gal
  • 使用 ReactJs 更改 Ant Design 变量

    我在用antd我的应用程序中的库 根据文档 我可以通过更改变量来自定义主题 例如 modifyVars primary color EB564F link color 0DD078 success color 0DD078 border r
  • 如何在 POST 请求期间刷新会话?

    我正在 Symfony2 中构建一个 Ajax 应用程序 用户登录 然后从那时起 一切都由 POST 请求处理 将会话生命周期定义为 5 分钟后config yml 我遇到了用户会话在 5 分钟后失效的问题 即使他们正在发出 POST 请求
  • 自动加载路径和嵌套服务类在 Ruby 中崩溃

    我有多个问题需要加载 需要我的类app servicesRails 5 项目中的文件夹 我开始放弃这个问题 首先要明确的是 services 是我在整个项目中使用的简单 PORO 类 用于从控制器 模型等中抽象出大部分业务逻辑 这棵树看起来
  • 是否有一个 jQuery 解决方案,在可用时使用 CORS,并在 MSIE 上使用 XDomainRequest,在浏览器上使用 niether 时使用 JSONP?

    我愚蠢地相信所有现代浏览器都支持CORS 跨域资源共享 当我的玩具 JavaScript 工具无法在 IE9 或 Opera 上运行时 我发现前者只支持CORS通过XDomainRequest jQuery 似乎不支持 歌剧不支持CORS还
  • C# 泛型与 C++ 模板 - 需要澄清约束

    复制 C 和 Java 中的泛型与 C 中的模板有什么区别 Hi all 我是一位经验丰富的 C 程序员 但对 C 还很陌生 这些限制和泛型怎么了 为什么它的工作方式与 C 中的约束不同 C 中的约束是隐式的 并且是从您对模板类进行的实例化
  • 将大型 CSV 文件加载到核心数据中的最快方法是什么

    结论我想问题已经解决了 看起来这个问题与方法无关 但 XCode 没有在构建之间正确清理项目 看起来在所有这些测试之后 正在使用的 sqlite 文件仍然是第一个没有索引的文件 当心 XCode 4 3 2 我除了 Clean 不清理的问题
  • 以最快、最有效的方式调整 UIImage 大小

    我想将 UIImage 的大小调整为一定的宽度和高度 保持比例不变 最简单的方法是 CGSize newSize CGSizeMake 726 521 UIGraphicsBeginImageContext newSize image dr
  • 避免在 scikit learn StandardScaler 中缩放二进制列

    我正在 sci kit learn 中构建线性回归模型 并将输入缩放为 sci kit learn Pipeline 中的预处理步骤 有什么方法可以避免缩放二进制列吗 发生的情况是这些列与其他列一起缩放 导致值以 0 为中心 而不是 0 或
  • 使用 CSS 更改链接文本

    我想用 CSS 更改我的链接文本 但它不起作用 a testclass display none a testclass after content new text a class testclass href someurl com C
  • 在 Haskell 中使用填充进行压缩

    有几次我发现自己想要一个zip在 Haskell 中 它会向较短的列表添加填充 而不是截断较长的列表 这很容易写 Monoid在这里对我有用 但您也可以只传递要用于填充的元素 zipPad Monoid a Monoid b gt a gt