Haskell 中无限列表的笛卡尔积

2023-11-27

我有一个有限列表的函数

> kart :: [a] -> [b] -> [(a,b)]
> kart xs ys = [(x,y) | x <- xs, y <- ys]

但如何实现它infinite清单?我听说过一些关于康托尔和集合论的事情。

我还发现了一个类似的功能

> genFromPair (e1, e2) = [x*e1 + y*e2 | x <- [0..], y <- [0..]]

但我不确定这是否有帮助,因为 Hugs 只会不停地发放配对。

感谢帮助。


你的第一个定义,kart xs ys = [(x,y) | x <- xs, y <- ys],相当于

kart xs ys  =  xs >>= (\x ->
               ys >>= (\y -> [(x,y)]))

where

(x:xs) >>= g  =  g x ++ (xs >>= g)
(x:xs) ++ ys  =  x : (xs ++ ys)

是顺序操作。将它们重新定义为交替操作,

(x:xs) >>/ g  =  g x +/ (xs >>/ g)
(x:xs) +/ ys  =  x : (ys +/ xs)
[]     +/ ys  =  ys

你的定义也应该适合无限列表:

kart_i xs ys  =  xs >>/ (\x ->
                 ys >>/ (\y -> [(x,y)]))

testing,

Prelude> take 20 $ kart_i [1..] [101..]
[(1,101),(2,101),(1,102),(3,101),(1,103),(2,102),(1,104),(4,101),(1,105),(2,103)
,(1,106),(3,102),(1,107),(2,104),(1,108),(5,101),(1,109),(2,105),(1,110),(3,103)]

礼貌地《理性的阴谋家》。 (也可以看看康达、康迪、康德、康杜).


另一种更明确的方法是创建单独的子流并将它们组合起来:

kart_i2 xs ys = foldr g [] [map (x,) ys | x <- xs]
  where
     g a b = head a : head b : g (tail a) (tail b)

这实际上产生了完全相同的结果。但现在我们可以更好地控制如何组合子流。我们可以更加对角:

kart_i3 xs ys = g [] [map (x,) ys | x <- xs]
  where                                       -- works both for finite
  g [] [] = []                                --  and infinite lists
  g a  b  = concatMap (take 1) a
            ++ g (filter (not . null) (take 1 b ++ map (drop 1) a))
                 (drop 1 b)

所以现在我们得到

Prelude> take 20 $ kart_i3 [1..] [101..]
[(1,101),(2,101),(1,102),(3,101),(2,102),(1,103),(4,101),(3,102),(2,103),(1,104)
,(5,101),(4,102),(3,103),(2,104),(1,105),(6,101),(5,102),(4,103),(3,104),(2,105)]

和一些在 SO 上搜索我还找到了一个诺曼·拉姆齐的回答似乎还有另一种生成序列的方式,将这些子流分成四个区域 - 左上角、顶行、左列,以及递归其余部分。他的merge有和我们一样的+/ here.


你的第二个定义,

genFromPair (e1, e2) = [x*e1 + y*e2 | x <- [0..], y <- [0..]]

相当于只是

genFromPair (e1, e2) = [0*e1 + y*e2 | y <- [0..]]

因为名单[0..]是无限的,没有机会得到任何其他值x发挥作用。This这是上述定义都试图避免的问题。

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

Haskell 中无限列表的笛卡尔积 的相关文章

  • 属性错误:“列表”对象没有属性“拆分”

    我正在尝试读取一个文件并用逗号分隔每行中的一个单元格 然后仅显示第一个和第二个单元格 其中包含有关纬度和经度的信息 这是文件 time 纬度 经度 类型2015 03 20T10 20 35 890Z 38 8221664 122 7649
  • Backbone Marionette CompositeView 排序列表 - 在添加时呈现额外的模型

    这是小提琴 http jsfiddle net QhQ8D 10 http jsfiddle net QhQ8D 10 代码在下面 制作一个聊天应用程序 需要一个排序的 连接的用户列表 名称上带有比较器的图形集合连接到 CompositeV
  • 查找列表中项目的索引

    给定一个列表 foo bar baz 和列表中的一个项目 bar 如何获取它的索引1 gt gt gt foo bar baz index bar 1 See 文档 https docs python org tutorial datast
  • Haskell Stack 从 github 安装包依赖项

    是否可以使用 Haskell 堆栈从 github 安装软件包的版本 例如在一个 cabal or a stack yaml文件 如何在 git repo branch revision 上指向依赖项 对于堆栈 The 的文档stack y
  • 用于遇到 [...] 的 Haskell Parsec 解析器

    我正在尝试使用 Parsec 在 Haskell 中编写一个解析器 目前我有一个可以解析的程序 test x 1 2 3 end 执行此操作的代码如下 testParser do reserved test v lt identifier
  • 如何在haskell中获取变量名称

    我来到 haskell 时有一些 c 背景知识 想知道是否有类似的 define print a printf s d n a a int a 5 print a 应该打印 a 5 这是 augustss 提到的 TH 解决方案 LANGU
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • scala 返回列表中的第一个 Some

    我有一个清单l List T1 目前我正在执行以下操作 myfun T1 gt Option T2 val x Option T2 l map myfun l flatten find gt true The myfun函数返回 None
  • Haskell 输入返回元组

    我想知道 IO 函数是否可以返回元组 因为我想从这个函数中获取这些元组作为另一个函数的输入 investinput IO gt Char Int investinput do putStrLn Enter Username username
  • 为什么 ZipList 不是 List 的默认应用实例

    我目前正在学习 Haskell 中的应用程序 如果我没记错的话 列表有两个不同的应用实例 List and ZipList 第二个被定义为包装列表值的新类型 这ZipList应用实例对我来说似乎更直观 这可能是一个愚蠢的问题 但有具体原因吗
  • 如何将Scheme中的函数应用于另一个函数返回的参数列表?

    假设有两个函数 f 和 v 进一步假设 v 返回长度为 n 的列表 并且 f 需要恰好 n 个参数 我正在Scheme中寻找正确的语法 以将f应用于v返回的列表 如果我使用语法 f v v arguments 然后我收到一个关于 f 需要
  • 使用 LINQ 通过一个属性比较两个列表

    假设我有以下内容 class Widget1 public int TypeID get set public string Color get set class Widget2 public int TypeID get set pub
  • 如何在 R 中合并同名列表中的数据框?

    我有一个包含很多数据框的列表 如果它们具有相同的名称 我想合并它们 即合并所有具有相同名称 a 和 b 的数据框 像这样 a lt aaaaa b lt bbbbb c lt ccccc g lt list df1 lt data fram
  • C# List 内部结构

    将对象添加到集合 例如 List 时到底会发生什么 List
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 需要在R中按行绑定列表数据

    我在 R 中按行绑定列表时遇到问题 我的列表数据集是 id 1 data k 1 id k b c 1 1 1 3 data k 2 id k b c 1 2 1 4 id 2 data k 1 id k b c 2 1 1 6 data
  • 大多数列表共有的项目

    给定一个列表列表 假设有 5 个列表 以便有一个可以使用的实数 我可以相对轻松地找到所有 5 个列表所共有的项目 请参阅使用 IEnumerable Intersect 求多个列表的交集 https stackoverflow com qu
  • PYTHON 从嵌套列表中删除元素

    我有一个像这样的数组 dataSet 387230 296163 323434 311472 323412 166282 410119 我想删除元素 311472 但不知道如何删除 我努力了 for set in dataSet for i
  • 使用 pandas 单元格中列表的长度选择行[重复]

    这个问题在这里已经有答案了 我有一张表 df a b c 1 x y x 2 x z c d 3 x t e f g 只是想知道如何使用 c 列的长度选择行 such as df loc len df c gt 1 我知道这是不对的 正确的
  • 列表值的意外更改

    这是我的课 class variable object def init self name name alias parents values table name of the variable self name 这是有问题的函数 f

随机推荐

  • 将 Nhibernate 查询转换为通用列表时出错

    我有一个简单的实体称为EmployeeEntity有属性ID Name Age Organisation and Designation 我只是使用查询来查询数据库 IQuery query session CreateQuery sele
  • 忽略 Powershell Invoke-RestMethod 中的自签名证书不起作用(又变了......)

    使用忽略证书验证的标准解决方案后 Invoke RestMethod正在返回 Invoke RestMethod A system error occurred and has been logged Please try again la
  • Matlab - 如何替换向量中的所有特殊字符?

    是否可以通过正则表达式替换matlab向量中的所有特殊字符 谢谢 EDIT 谢谢你的回复 我正在努力实现以下目标 我有一个文本文件 其中包含小说中的几个段落 我已将此文件读入向量 fileText Token1 token 2 token
  • 静态对象的私有析构函数是如何调用的? [复制]

    这个问题在这里已经有答案了 可能的重复 无法访问单例类析构函数中的私有成员 我正在实现一个单例 如下所示 class A public static A instance private A void cout lt lt In the c
  • 为什么需要将 ~/.rbenv/bin 添加到我的路径中?

    我读到rbenv 无法更改全局 ruby 版本我需要添加 rbenv bin到我的 PATH 以便 rbenv 工作 文中也提到了这一点rbenv 文档但该目录不存在 如下所示 ls a rbenv plugins shims versio
  • .NET 反射:检测 IEnumerable

    我正在尝试检测 Type 对象的特定实例是否是通用的 IEnumerable 我能想到的最好的办法是 theType might be typeof IEnumerable
  • Sqlplus可以将文件内容读取到变量中吗?

    我已经修改 sqlplus 一段时间了 我已经设法让 sqlplus 将文件的内容读入替换变量 如下所示 exit sqlplus s login pass db script sql cat file txt 这主要按照我的脚本要求工作
  • 使用 DirectShow.NET 从网络摄像头捕获帧

    我是 DirectShow 的新手 所以这个库的某些部分我不太理解 我已经看到示例 DxSnap 但我需要捕获帧而不预览它 进行进一步处理 我该怎么做 如果您主要关心的是 访问网络摄像头 而不是 使用 DirectShow 访问网络摄像头
  • AVPlayer 不同步

    我实在是没办法了 只好再请教大家了 我正在构建一个使用 AVPlayer 的三个实例的 iPhone 应用程序 他们同时进行比赛 这一点非常重要 我曾经运行过这段代码 CMClockRef syncTime CMClockGetHostTi
  • Paho MQTT Android 服务问题

    我正在我正在开发的应用程序中实现 Paho MQTT Android 服务 在测试了 Paho 提供的示例应用程序后 我发现有一些我想要更改的内容 https eclipse org paho clients android 一旦应用程序完
  • 如何使用动画为搜索栏添加动画

    我是安卓新手 我正在尝试为水平搜索栏设置动画 但到目前为止还无法做到 我只想要一个动画 其中搜索栏显示某个持续时间 例如 1 分钟 的进度 有人可以建议 给出关于如何为标准搜索栏设置动画的想法 代码片段吗 我应该使用哪种动画 例如 obje
  • 在 PHP 中,如何添加到零填充数字字符串并保留零填充?

    如果我在 PHP 中有一个变量包含0001我加 1 结果是 2 而不是0002 我该如何解决这个问题 foo sprintf 04d foo 1
  • 应用程序确实收到本地通知未触发 iOS 7

    问题 void application UIApplication application didReceiveLocalNotification UILocalNotification notification 有时在 iOS 7 中不会
  • 如何在 pandas groupby 中聚合多列

    我使用以下输入创建了一个 pandas 数据框 mn keyA state n1 n2 d1 d2 key1 CA 100 1000 1 2 key2 FL 200 2000 2 4 key1 CA 300 3000 3 6 key1 AL
  • R重命名函数中传递的列

    我一直在寻找这个并发现这个链接有助于重命名函数中传递的列 column name 实际制作的代码my function1在我寻找了一段时间后工作 有没有办法使用管道运算符来重命名函数内数据框中的列 我的尝试显示在my function2但它
  • Ubuntu 上的 ASP.Net Core 应用程序服务仅侦听端口 5000

    我正在尝试在 Ubuntu 服务器上托管 ASP Net Core MVC 应用程序 启用了 https 重定向 使用 Nginx 作为反向代理 我已使用 OpenSSL 创建并安装了本地 SSL 证书 当我使用 dotnet CLI 运行
  • 为什么 Web 部署代理服务监听端口 80 和 8172

    在四个 Win Server 2008 R2 机器上 我们安装了 MS Deploy 它侦听端口 80 和 8172 这使人们对网络上有关在 IIS 7 上运行时无需更改端口 80 默认值的所有其他材料产生疑问 我无法理解 为什么它使用两个
  • std::move 如何将表达式转换为右值?

    我不完全理解的实现std move 也就是说 我对 MSVC 标准库中的这种实现感到困惑 template
  • 使用 php 在文本文件中搜索短语/单词

    我如何扫描目录中的特定文本行并使用 php 列出所有匹配的文件 Thanks 几天前我实际上为此编写了一个函数 这是扫描每个文件的基本函数 foreach glob
  • Haskell 中无限列表的笛卡尔积

    我有一个有限列表的函数 gt kart a gt b gt a b gt kart xs ys x y x lt xs y lt ys 但如何实现它infinite清单 我听说过一些关于康托尔和集合论的事情 我还发现了一个类似的功能 gt