在 Haskell 中操作元组

2023-12-31

我是 Haskell 的新手,我有一个关于元组的问题。难道就没有遍历元组的方法吗?我知道使用列表进行遍历非常容易,但是如果输入作为元组给出,是否没有办法像使用列表一样检查整个元组?如果不是这种情况,是否可以将元组中的值提取到列表中并以这种方式执行遍历?


在 Haskell 中,使用元组作为通用可遍历容器并不被认为是惯用的(也不是真正可能的)。您处理的任何元组都将具有固定数量的元素,这些元素的类型也是固定的。 (这与 Python 中惯用的元组使用方式有很大不同。)您询问“输入作为元组给出”的情况,但如果输入将具有灵活数量的元素,那么它肯定会won’t作为元组给出——列表是更可能的选择。

这使得元组看起来不如其他一些语言灵活。好处是您可以使用模式匹配来检查它们。例如,如果您想计算元组中每个元素的某个谓词并返回True如果谓词适用于所有这些,您会写类似的内容

all2 :: (a -> Bool) -> (a, a) -> Bool
all2 predicate (x, y) = predicate x && predicate y

或者,对于三元素元组,

all3 :: (a -> Bool) -> (a, a, a) -> Bool
all3 predicate (x, y, z) = predicate x && predicate y && predicate z

您可能会想,“等等,您需要为每个元组大小提供一个单独的函数?!”是的,您确实如此,并且您可以开始明白为什么元组的用例和列表的用例之间没有太多重叠。元组的优点正是在于它们are有点不灵活:你总是知道它们包含多少个值,以及这些值的类型。前者对于列表来说并不正确。

难道就没有遍历元组的方法吗?

据我所知,没有内置的方法可以做到这一点。写下遍历 2 元组、遍历 3 元组等的指令是很容易的,但这会有很大的限制,即您只能处理元素都具有相同的元组类型。

想想map函数作为一个简单的例子。您可以申请map到类型列表[a]只要你有一个函数a -> b。在这种情况下map看着每个a依次获取值,将其传递给函数,并组装结果列表b价值观。但对于元组,您可能拥有三个值都是不同类型的元素。您的转换函数as to b如果元组由两个组成,则 s 是不够的a价值观和c!如果你尝试开始写下Foldable实例或Traversable例如,即使只是对于二元素元组,您很快就会意识到这些类型类并不是为了处理其值可能具有不同类型的容器而设计的。

是否可以将元组中的值提取到列表中?

是的,但是对于输入元组的每个可能大小,您需要一个单独的函数。例如,

tupleToList2 :: (a, a) -> [a]
tupleToList2 (x, y) = [x, y]

tupleToList3 :: (a, a, a) -> [a]
tupleToList3 (x, y, z) = [x, y, z]

当然,好消息是您永远不会遇到必须处理任意大小的元组的情况,因为这在 Haskell 中不会发生。考虑一下接受任意大小的元组的函数的类型签名:你怎么能这样写?

在任何接受元组作为输入的情况下,可能没有必要首先将元组转换为列表,因为模式匹配语法意味着您可以单独寻址元组的每个元素,并且您始终准确地知道将会有多少个这样的元素。

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

在 Haskell 中操作元组 的相关文章

  • 将带有两层分隔符的字符串转换为字典 - python

    给定一个字符串 s x t1 ny t2 nz t3 我想转换成字典 sdic x 1 y 2 z 3 我通过这样做让它工作 sdic dict tuple j split t for j in i for i in s split n F
  • 在 json 模式中制作条件数组并提供适当的错误消息的最佳方法

    我想在 JSON 模式中约束一个 元组 数组 并获得不错的错误消息 但到目前为止我还没有成功 该数组由 2 个项目组成 第一个是字符串 第二个是对象 对象中允许 必需的属性取决于字符串 2个有效的例子是 color white a whit
  • 应用交换律

    带有效果的应用程序编程 http staff city ac uk ross papers Applicative html麦克布莱德和帕特森的论文提出了互换法 u lt gt pure x pure f gt f x lt gt u 为了
  • Haskell 真的是纯粹的吗(有任何语言可以处理系统外的输入和输出)吗?

    在谈到函数式编程中的 Monad 后 该功能是否真的使语言变得纯粹 或者它只是黑板数学之外的现实世界中计算机系统推理的另一张 免狱卡 EDIT 这不是有人在这篇文章中所说的火焰诱饵 而是一个真正的问题 我希望有人能用它来击倒我并说 证明 它
  • 如何向 Scotty 中间件添加基本身份验证?

    我目前正在制作 Scotty API 但找不到任何 basicAuth 实现的示例 Wai Middleware HttpAuth 具体来说 我想将基本身份验证标头 用户 通行证 添加到我的某些端点 即以 admin 开头的端点 我已经设置
  • Haskell 二进制解析

    我一直在尝试在 haskell 中实现一个协议解析器 而且我对这门语言还很陌生 特别是当涉及到 monad 时 我一直在使用binary 0 5 0 2 并描述了协议的标头和所有有效负载 我想要解析的消息如下所示 header payloa
  • Haskell 中的常量变量声明

    要声明常量变量 我可以在 Ruby 中执行以下操作 class COLOR RED 10 BLUE 20 GREEM 30 end COLOR RED回报10 COLOR BLUE回报20 等等 我如何在 Haskell 中实现这一点 我想
  • 将 python 字典翻译为 C++

    我有包含以下代码的 python 代码 d d 0 0 0 d 1 2 1 d 2 1 2 d 2 3 3 d 3 2 4 for i j in d print d i j d j i 不幸的是 对于我的目的来说 循环遍历 python 中
  • 将元组添加到 Python 中的元组列表

    我是 python 新手 不知道执行此操作的最佳方法 我有一个代表点的元组列表和另一个代表偏移量的列表 我需要一组由此形成的所有组合 这是一些代码 offsets 0 0 0 1 0 1 1 0 1 0 points 1 5 3 3 8 7
  • 如何使用append/3在prolog中递归构建列表?

    我需要了解一些事实的价值 这部分似乎正在发挥作用 fact1 A Val1 fact2 B Val2 A B 但是一旦我尝试附加这些值 Val1 Val2 通过使用append 3谓词到列表 OutList 我只得到一个可能的解决方案 而不
  • 处理许多不相关的类型时避免样板

    我正在编写处理以下值的代码语言 扩展 注释 语法 http hackage haskell org packages archive haskell src exts 1 1 4 doc html Language Haskell Exts
  • Haskell 测量函数性能

    在 Haskell 中 我如何 简单地 测量函数的性能 例如 运行需要多长时间 或者需要多少内存 我知道分析 但是 是否有一种更简单的方法不需要我对代码进行太多更改 测量运行需要多长时间以及需要多少内存是两个独立的问题 即 基准测试和分析
  • Python 将字典中的值转换为元组

    我有一个字典列表 如下所示 id 1 name Foo id 2 name Bar 我想将每个字典中的值转换为元组列表 如下所示 1 Foo 2 Bar 我怎样才能做到这一点 gt gt gt l id 1 name Foo id 2 na
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • C++11 在运行时索引元组而不使用 switch 的方法

    我有一段 c 11 代码 如下所示 switch var case 1 dosomething std get lt 1 gt tuple case 2 dosomething std get lt 2 gt tuple 有什么办法可以把这
  • 在 Haskell 命令行应用程序中提示输入密码

    以下 Haskell 程序提示用户在终端中输入密码 如果输入正确则继续 main do putStrLn Password password lt getLine case hash password member database of
  • 为什么 exceptT 没有 MonadMask 实例?

    爱德华 克梅特例外情况图书馆不提供单子掩码 https www stackage org haddock lts 7 18 exceptions 0 8 3 Control Monad Catch html t MonadMask实例为Ex
  • 有没有办法在 Emacs 中使用 Djinn 自动生成 Haskell 代码?

    标题几乎说明了一切 我正在寻找这样的东西 f Int gt Bool gt Int f body Djinn 可以使用定理证明来通过证明该类型存在来生成此类函数的代码 我想知道 是否有现有的方法可以从 Emacs 中获取此功能 因此 我不需
  • 如何避免编写这种类型的 Haskell 样板代码

    我经常遇到这种情况 这很烦人 假设我有一个 sum 类型 它可以保存一个实例x或一堆其他无关的事情x data Foo x X x Y Int Z String other constructors not involving x 要声明
  • 为什么 Haskell 中的点是从右向左排列的?

    如果我们有两个函数 f and g 然后在哈斯克尔h f g相当于h x f g x IE 这些函数从右到左应用于输入 有什么根本原因可以解释为什么它是从右到左 而不是从左到右吗 IE 他们为什么不做h f g相当于h x g f x 反而

随机推荐

  • Excel vba 代码停止工作(变量未定义)

    免责声明 我不是程序员 我把时间花在服务器故障上 我只是一个低级管理员 我们有一个在 Office 2003 中创建的 Excel 电子表格 其中包含 vba 代码 我们最近使用了 Office 2007 电子表格继续正常工作 但是 安装
  • 使用 WaitForMultipleObjects 等待多个线程

    我正在使用WaitForMultipleObjects函数等待多个线程的完成 但我做错了什么 因为结果不是预期的 请参阅此示例代码 type TForm1 class TForm Memo1 TMemo Button1 TButton pr
  • teamcity 构建项目无法启动 MSBuild.exe。路径中存在非法字符

    我正在尝试在 teamcity 中构建一个项目 它将执行 TFS 的签出 并且文件位于构建服务器本地 如果我在服务器上手动运行构建命令 它会起作用 C WINDOWS Microsoft NET Framework v4 0 30319 m
  • 如何在 Ruby 中修复这个多行正则表达式?

    我的 Ruby 正则表达式在多行模式下无法正常工作 我正在尝试将 Markdown 文本转换为 Redmine 中使用的 Textile eque 标记 问题出在我用于转换代码块的正则表达式中 它应该找到任何以 4 个空格或制表符开头的行
  • Bitbucket git 凭证(如果已通过 Google 注册)

    我在 bitbucket org 上有一个帐户 是通过使用我的 Google 帐户注册创建的 现在 每次登录时 我只需单击 使用 Google 登录 即可 如何从 git 命令行访问我的存储库 它要求我输入用户名和密码 我有用户名 但没有密
  • python multiprocessing - 将子进程日志发送到在父进程中运行的GUI

    我正在编写的一些分析代码之上构建一个接口 用于执行一些 SQL 并处理查询结果 我想向用户公开此分析代码中围绕许多事件的日志记录 因为分析代码运行时间相当长 并且因为我不希望 UI 阻塞 所以到目前为止我已经通过将分析函数放入其自己的线程中
  • 类型“boolean”不可分配给类型“ObservableInput<{}>”

    我正在开发 Angular 6 项目 我正在为我的routeGuards 使用 canDeactivate 并使用弹出窗口来显示路线留下消息 但问题出在我的价格表守卫服务上悬停 flatMap isAllow gt Error 类型 isA
  • 让文本穿过 div

    好的 这是一项调查 其中 div 是图表 就像您在 Facebook 上看到的那样 基本上 div style border 1px solid black width 300px div style width 100px This te
  • 通过 google play 更新应用程序时下载内容?

    所以这是我第一次发送我的应用程序的更新 我不知道通过 google play 更新应用程序时实际会发生什么 以下是一些我无法得到答案的问题 实际更新了什么以及这个过程如何工作 即更新完成时的方法或回调 共享首选项文件会发生什么情况 名称值对
  • 属性或枚举或静态最终

    当涉及到在名称 值对中声明预定义常量时 我 一直在 java util Properties enums 或具有 public static final 值的单独类之间随机选择 为了供将来参考 我需要一些关于采取哪种方法的指南 Thanks
  • MSDN 上的 101 LINQ 示例中的这段代码是否存在错误? (更新:已修复)

    NOTE 查理 卡尔弗特 https stackoverflow com users 253576 ccalvert下面回复说 101 个 LINQ 示例现已更新为正确的代码 MSDN Visual C 开发人员中心有一个名为101 个 L
  • 任务中的基本容器已退出

    我正在尝试使用 aws ecs 配置我的 docker hub 映像 我在运行任务时创建了存储库 集群和任务 但在任务退出 1 中收到错误作为基本容器 在尝试获取确切的错误详细信息时 我发现我的一些变量显示为未配置 找到错误所附的屏幕截图
  • 如何删除旧的订阅

    我有 3 年的订阅 我只想删除 2 年未使用的旧订阅和孤儿订阅 下面的脚本显示了所有订阅 计划 创建时间 上次执行时间 对于缺乏归属表示歉意 您可以使用它来查找要转储的订阅位置 并使用 Kavins 指示手动删除它们 SSRS SUbscr
  • 如何使用 sympy 定义条件函数?

    我希望能够定义一个表达式 该表达式获取定义变量的所有值并将表达式计算为0当它没有定义时 与此类似 import numpy as np import sympy as sp def expr k1 k2 x y sp symbols x y
  • VB.NET - 计算两个日期之间的天数(排除)

    我正在尝试计算两个日期之间的天数 不包括星期六 and Sundays 到目前为止我已经写了这段代码 Dim startDay As Integer Dim endDay As Integer Dim days As Integer Dim
  • Elastic Search 匹配短语查询 -> 输出不可预测

    示例文档 id 5 title Quick Brown fox jumps over the lazy dog genre fiction Mapping movies mappings properties genre type text
  • Jupyter Notebook 和之前的输出

    有什么方法可以在不重新运行程序的情况下查看以前的输出吗 例如 我让机器学习算法过夜 早上我就得到了结果 但是 由于某种原因 当我在原始代码上按 Enter 时 它再次开始运行 原始输出消失了 输出存在于特定的上下文中 即单元 并且只要内核仍
  • 什么事件捕获 DataGridViewCell 中组合框中的值更改?

    我想在 a 中的值发生更改时处理该事件ComboBox in a DataGridView cell 有的是CellValueChanged事件 但直到我单击事件内的其他位置后 该事件才会触发DataGridView 一个简单的ComboB
  • ggplot:同时通过“geom_rect”排列因子顺序并突出显示区域

    首先 指定分类变量顺序的方法ggplot是重新排序它的级别data frame 其次 要在我们可以使用的任何绘图上突出显示一个区域geom rect 这里需要注意的是 不要将数据传递给geom rect 否则它不允许我们设置alpha 因此
  • 在 Haskell 中操作元组

    我是 Haskell 的新手 我有一个关于元组的问题 难道就没有遍历元组的方法吗 我知道使用列表进行遍历非常容易 但是如果输入作为元组给出 是否没有办法像使用列表一样检查整个元组 如果不是这种情况 是否可以将元组中的值提取到列表中并以这种方