重载 Haskell 中的内置函数

2023-12-15

在 Haskell 中,如何重载内置函数,例如!!?

我最初是想弄清楚如何重载内置函数!!通过自己的数据类型来支持。具体来说,!!属于以下类型:

[a] -> Int -> a

我想保留它的现有功能,但也能够在其类型签名看起来更像的地方调用它

MyType1 -> MyType2 -> MyType3

我最初想这样做是因为 MyType1 就像一个列表,我想使用!!运算符,因为我的操作与从列表中选择一项非常相似。

如果我超载了类似的东西+我可以将函数的实例添加到适用的类型类中,但我认为这不是一个选项。

我不相信我真的想再重载这个函数,但我仍然对它是如何完成的感兴趣。实际上,评论是否重载运算符,例如!!即使是一个好主意也会受到赞赏。


在 Haskell 中,几乎所有运算符都是库定义的。您最常用的许多库都是在默认导入的 Prelude 模块的“标准库”中定义的。加布里埃尔的答案展示了如何避免导入其中一些定义,以便您可以创建自己的定义。

那不是超载但是,因为运算符仍然只意味着一件事;您为其定义的新含义。 Haskell 提供的重载的主要方法,即以针对不同类型具有不同实现的方式使用运算符,是类型类别机制。

类型类标识了一组支持某些通用功能的类型。当您将这些函数与类型一起使用时,Haskell 会计算出正确的值instance适用于您的用法并确保使用函数的正确实现的类型类。大多数类型类只有几个函数,有些只有一两个,需要实现这些函数才能创建新实例。其中许多还提供了许多根据核心函数实现的辅助函数,并且您可以将所有这些函数与创建类实例的类型一起使用。

碰巧其他人制作的类型的行为有点像列表,所以已经有一个类型类称为ListLike。我不确定你的类型与列表到底有多接近,所以它可能不适合 ListLike,但你应该看看它,因为如果你可以使你的类型成为 ListLike 实例,它将为你提供很多功能。

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

重载 Haskell 中的内置函数 的相关文章

  • 使用 Parsec 解析正则表达式

    我正在尝试通过实现一个小型正则表达式解析器来学习秒差距 在 BNF 中 我的语法类似于 EXP EXP LIT EXP LIT 我尝试在 Haskell 中实现这一点 expr try star lt gt try litE lt gt l
  • 使用默认值压缩而不是删除值?

    我正在 haskell 中寻找一个函数来压缩两个长度可能不同的列表 我能找到的所有 zip 函数都只是删除列表中比其他列表长的所有值 例如 在我的练习中 我有两个示例列表 如果第一个比第二个短 我必须用 0 填充 否则我必须使用 1 我不允
  • Haskell Cabal:“包间接依赖于同一包的多个版本”

    清除我的所有后cabal installed 包 我运行了以下会话 cabal update Downloading the latest package list from hackage haskell org james bast c
  • Cabal 无法安装依赖项,但如果直接询问可以安装它们

    我发现 Cabal 反复出现一个非常奇怪的问题 它影响了我获得可重复的 Haskell 构建的能力 我有一个带有沙箱的阴谋集团项目 如果我做cabal install 我收到以下形式的错误 Y failed during the build
  • boost.log std::exception 格式化程序无法在自己的命名空间中找到运算符 << 重载

    我为 boost log 创建了一个简单的格式化程序 如下所示this http www boost org doc libs 1 59 0 libs log doc html log extension settings html例如st
  • 函数的不明确的引用/值版本

    考虑以下函数原型 void Remove SomeContainer Vec const std size t Index SomeContainer Remove SomeContainer Vec const std size t In
  • Cabal:使用源代码构建目录

    我有一个src目录 在这个目录中我有Main hs文件和Test目录 在里面Test我有的目录Test hs模块 我需要用 cabal 来编译它 在我的阴谋集团文件中 我有 Executable main hs or lhs file co
  • 承诺的反面是什么?

    承诺代表将来可能可用 或无法实现 的值 我正在寻找的是一种数据类型 它表示将来可能变得不可用的可用值 可能是由于错误 Promise a b TransitionFromTo
  • 当约束成立时,将没有约束的 GADT 转换为另一个有约束的 GADT

    我们能否将构造函数没有给定约束的 GADT 转换为具有上述约束的 GADT 我想这样做是因为我想要深度嵌入箭头并用 目前 似乎需要的表示做一些有趣的事情Typeable 一个理由 https stackoverflow com a 1223
  • 告诉阴谋集团主模块在哪里

    我有一个具有以下结构的项目 foo cabal src Foo Main hs foo cabal 的一部分如下所示 executable foo main is Foo Main hs hs source dirs src Main hs
  • 不理解 Monoid 定义中态射的表示法

    我试图理解什么Monoid是从范畴论的角度来看的 但我对用来描述它的符号有点困惑 这是维基百科 在范畴论中 幺半群范畴 C I 中的幺半群 或幺半群对象 M 是一个对象 M 和两个态射 M M M 称为乘法 I M 称为单位 我的困惑在于态
  • Haskell 有 takeUntil 函数吗?

    目前我正在使用 takeWhile x gt x 1 x 89 l 从列表中获取最多为 1 或 89 的元素 但是 结果不包括这些标记值 Haskell 是否有一个标准函数可以提供这种变化takeWhile结果中包含哨兵 到目前为止 我对胡
  • 带有参考的 Haskell 数据类型

    我正在实现 Ukkonen 的算法 该算法要求树的所有叶子都包含对同一整数的引用 并且我在 Haskell 中执行此操作是为了了解有关该语言的更多信息 但是 我很难编写出执行此操作的数据类型 Node has children indexe
  • 如何获得具有超载字段名称的经典镜头?

    我正在尝试为具有相同字段名称的记录构建镜头 除此之外 我试图 包装 扩展 这些基本记录 并希望相同的字段名称适用于包装 扩展的记录 我相信 优雅的镜头就是这样做的 我如何让以下内容发挥作用 Data types for context of
  • 我可以在线性时间内检查有界列表是否包含重复项吗?

    假设我有一个Int列表 其中元素已知是有界的 并且列表已知不长于它们的范围 因此它完全有可能不包含重复项 如何才能最快地测试是否是这种情况 我知道nubOrd https hackage haskell org package contai
  • 如何重载“新”方法?

    我刚刚开始学习 Rust 我想知道是否有方法重载方法 首先 我创建了一个结构并使用 impl 来实现基本的 新 方法 然后我想添加带有一些参数的 新 方法 并且我尝试使用 Trait 来实现这一点 以下代码已成功编译 但是当我尝试将 new
  • 方法重载。你能过度使用它吗?

    当定义多个使用不同过滤器返回相同形状的数据的方法时 什么是更好的做法 显式方法名称或重载方法 例如 如果我有一些产品并且我正在从数据库中提取 显式方式 public List
  • Haskell 中动态规划的高效表

    我已经编码了0 1背包问题 http en wikipedia org wiki Knapsack problem 0 1 knapsack problem在哈斯克尔 我对迄今为止所取得的懒惰和普遍性水平感到相当自豪 我首先提供用于创建和处
  • 在帖子上生成最近帖子列表时,如何避免依赖循环?

    所以这有效 create archive html do route idRoute compile do posts lt myRecentFirst gitTimes lt lt loadAll posts let archiveCtx
  • 模式匹配中的 Monoid mempty

    我尝试写一个通用的maximum功能类似于Prelude 我的第一个天真的方法如下所示 maximum F Foldable a Ord b gt a b gt Maybe b maximum mempty Nothing maximum

随机推荐

  • Prolog 替换

    如何用包含要替换的变量的另一个列表替换一个列表 例如 rep x d e z x z p x z z x d c R R z c e x z x p x 到 z 和 z 在替换后不会改变 到目前为止我只做了没有清单的那一项 rep rep
  • 方法的 ES6 对象字面量语法

    我正在看这个这一页有关 ES6 中用于声明对象内部方法的各种简写语法 我不明白这两种形式之间的区别 var foo a b and var foo x y gt y 这篇文章似乎对这两种格式做了明确的区分 但是第一种格式不就真的变成了第二种
  • 带有 jQ​​uery 和 Masked 输入插件的电话掩码

    我在使用 jQuery 屏蔽电话输入时遇到问题屏蔽输入插件 有 2 种可能的格式 XX XXXX XXXX XX XXXXX XXXX 有什么办法可以掩盖它接受这两种情况吗 EDIT I tried phone mask 99 9999 9
  • 使用 urn:schemas 按电子邮件地址搜索

    I found 这段代码来自里卡多 迪亚兹 它贯穿始终 我想搜索我收到或发送到特定的最新电子邮件电子邮件地址与搜索相反subject 我更换了 searchString urn schemas httpmail subject like e
  • 反引号 (`...`) 在 JavaScript 中调用函数

    我不知道如何解释这一点 但是当我跑步时 console log 1 在谷歌浏览器中 我得到的输出如下 console log 1 VM12380 2 1 raw Array 1 为什么反引号调用日志函数 以及为什么它创建索引raw Arra
  • Python函数默认参数随机值

    在下面的代码中 按照预期生成了一个随机值 import random for i in range 10 print random randint 0 10 但是 如果我使用函数 这将不起作用 import random def f val
  • c++:MPI 通信器作为全局变量

    我需要可以在函数 类成员函数中访问 MPI 世界通信器 但按照设计 惯例 MPI 环境和通信器总是在开始时定义和初始化 int main 我能想到的唯一简单的解决方案是使用指向通信器的全局指针 有人知道更好的方法吗 使用全局指针解决方案有危
  • 像使用 MySQL 一样获取 Twitter 关注者

    你好 假设我有一个例子 我的关注表 A B 1 2 same so its friend 2 1 same so its a friend 1 3 user 1 is following 3 1 4 user 1 is following
  • clang 错误:未知参数:'-mno-fused-madd' (python 包安装失败)

    尝试安装时出现以下错误psycopg2通过 Mavericks 10 9 上的 pip clang error unknown argument mno fused madd Wunused command line argument ha
  • 如何使用 DocumentBuilderFactory Android 应用程序在 Android 中创建、读取和写入 XML 文件

    我正在使用我的应用程序实现一项服务 在Android应用程序中如何创建XML文件以及如何读取和写入XML文件 在我们的资源文件夹中 不使用SD卡 None
  • WebBrowser 控件 onpropertychange 事件的事件处理程序 - sender 和 e 对象为 null

    在 C 中 我在服务器端线程中运行 WebBrowser WB 控件 并希望监视 侦听 onpropertychange 事件 我可以成功附加一个在属性更改时执行的 NET 委托签名方法 但是sender 和 e 对象均为 null因此 在
  • IronPython 和 C# - 对 C# 对象的脚本访问

    考虑下面的代码 ScriptRuntimeSetup setup Python CreateRuntimeSetup null ScriptRuntime runtime new ScriptRuntime setup ScriptEngi
  • Android Studio 中的 ListFragment

    我正在浏览在线教程 试图了解 ListFragment 的工作原理以及我们如何使用它 这些教程有点模糊 我无法理解它到底是如何工作的 也无法在 Android Studio 上实现 ListFragment 有人可以提供有关 ListFra
  • 从分层 JSON 中挑选出简单属性

    尽管其他用户对我的标题进行了编辑 但我正在寻找一种使用 C 中的 JSON NET 库的解决方案 包含伪代码的回复就可以了 我正在尝试使用 JSON 数据集提供的分层数据 我正在使用 C 和 JSON NET 如果有帮助的话 我愿意一般 使
  • HTTP 页面正在删除我的安全 cookie

    我有一个混合 HTTP HTTPS 的网站 当用户登录时 她会收到两个 cookie 包含她 签名 用户名 登录过期时间和 不安全 标志的常规 cookie a secure cookie with her signed username
  • 使用 Python 和 Beautiful Soup 4 抓取 Twitter 时专注于特定结果?

    这是我的帖子的后续内容使用 Python 抓取 Twitter 中的嵌套 Div 和 Spans 我没有使用 Twitter API 因为它不会通过以下方式查看推文 话题标签这么远 完整的代码和输出如下示例所示 我想从每条推文中抓取特定数据
  • Jmeter 在每次 http 请求后清除 cookie

    在jmeter上下文中 有没有办法在同一线程组内的每个http请求之后清除cookie 在这种情况下 为什么您需要 HTTP Cookie 管理器 只需将其删除 您就会得到预期的行为 以防万一您遇到某种形式的奇怪的负面测试场景 Add a
  • 啊?添加 SDK 1.6 后 Android 首选项页面拒绝加载

    这个实在是太奇怪了 我有一个完美运行的 Eclipse Android 2 2 SDKboth管理员帐户andWindows XP 下的 LUA 有限用户帐户 然后我决定添加 Android 1 6 SDK 我只能通过管理员帐户来完成 看起
  • 如何将另一个站点的所有产品导入到magento站点

    嗨 任何人都可以帮助我吗 我已经在实时服务器上安装了magento 现在我想导入已准备好实时运行的网站的所有产品和类别 我该怎么做 请提供帮助 请参阅 Magento 维基 如何使用导入 导出工具添加 编辑 删除产品 Magento 比较特
  • 重载 Haskell 中的内置函数

    在 Haskell 中 如何重载内置函数 例如 我最初是想弄清楚如何重载内置函数 通过自己的数据类型来支持 具体来说 属于以下类型 a gt Int gt a 我想保留它的现有功能 但也能够在其类型签名看起来更像的地方调用它 MyType1