Haskell 中的链接/组合类型类

2024-01-30

假设我有两个定义如下的类型类,它们的功能相同但名称不同:

class Monad m where
    (>>=)  :: m a -> (a -> m b) -> m b
    return :: a -> m a

class PhantomMonad p where
    pbind    :: p a -> (a -> p b) -> p b
    preturn  :: a -> p a

有没有办法将这两个类绑定在一起,以便 PhantomMonad 的实例自动成为 Monad 的实例,或者必须显式编写每个类的实例?任何见解将不胜感激,谢谢!


好答案:不,您希望做的事情实际上并不可行。您可以编写一个看起来像您想要的那样的实例,在此过程中可能需要一些 GHC 扩展,但它不会按照您希望的方式工作。

不明智的回答:您可能可以使用可怕的类型级元编程来完成您想要的事情,但它可能会变得复杂。这真的不推荐,除非你绝对地由于某种原因需要这个工作。

正式来说,实例不能真正依赖于其他实例,因为 GHC 在做出决策时只查看“实例头”,而类约束位于“上下文”中。要在这里创建类似“类型类同义词”的内容,您必须编写类似于以下实例的内容Monad for 所有可能的类型,这显然没有意义。您将与其他实例重叠Monad,它有自己的问题。

最重要的是,我认为这样的实例无法满足实例解析的终止检查要求,因此您还需要UndecidableInstances扩展名,这意味着能够编写将 GHC 的类型检查器发送到无限循环的实例。

如果你真的想深入那个兔子洞,请浏览奥列格·基谢廖夫的网站 http://okmij.org/ftp/一点点;他可以说是 Haskell 类型级元编程的守护神。

当然,这很有趣,但如果您只是想编写代码并让它工作,那么可能不值得这么痛苦。

Edit:好吧,事后看来,我在这里夸大了这个问题。就像是PhantomMonad一次性工作正常,并且应该做你想做的事,考虑到Overlapping- and UndecidableInstancesGHC 扩展。当你想做比问题中的事情复杂得多的事情时,复杂的事情就开始了。我真诚地感谢诺曼·拉姆齐(Norman Ramsey)给我打电话——我真的应该更清楚。

我还是不太明白推荐做这种事没有充分的理由,但它并不像我听起来那么糟糕。抱歉。

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

Haskell 中的链接/组合类型类 的相关文章

随机推荐

  • 带有嵌套对象数组的胡子模板

    需要一点帮助来弄清楚为什么我的 Mustache 模板无法正确呈现 我很困惑为什么以下不起作用 我确信这是我的一个小错误或者其他什么 var tableRows name name1 values 1 2 3 name name2 valu
  • Python - 自动检测电子邮件内容编码

    我正在编写一个脚本来处理电子邮件 并且我可以访问电子邮件的原始字符串内容 我目前正在寻找字符串 Content Transfer Encoding 并扫描紧随其后的字符 以确定编码 编码示例 base64 或 7bit 或引用打印 有没有更
  • 在 Play Framework 2.0 上运行演化

    最近的这篇文章 如何在 Play Framework 2 0 中使用 Evolutions https stackoverflow com questions 8164157 how to use evolutions in play fr
  • 从我的网页访问 Flask 服务器

    这是一个问题 从这个问题继续here https stackoverflow com questions 22088719 can flask use with jquery post 我正在尝试使用网页上的图像按钮来控制伺服电机 我的伺服
  • 使用完整单词作为登录系统的变量[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在创建一个登录系统 当前使用硬编码整数作为用户 ID 密码和学生号 这意味着它们都是数字 我将使用什么来使整数 用户 ID 和密码 成为
  • PSQLException:当前事务被中止,命令被忽略直到事务块结束

    我在 JBoss 7 1 1 Final 的 server log 文件中看到以下 截断的 堆栈跟踪 Caused by org postgresql util PSQLException ERROR current transaction
  • 如何从其他节点js文件调用该函数

    这些代码存储在单独的文件中 我尝试从该文件调用 get 方法到另一个nodejs 但我只得到 Function 作为输出 谁能告诉我如何从这个文件调用另一个节点js文件的get方法 use strict var createAPIReque
  • 如何清除 MySQL 控制台中的屏幕? [复制]

    这个问题在这里已经有答案了 我无法清除 MySQL 命令行提示符中的屏幕 我的屏幕上充满了表格 数据和查询 我怎样才能清除它 Ctrl L 会做的 这是一个 shell 命令 但它在 MySQL 控制台中运行良好
  • 带 DatePicker 的 AlertDialog

    我的想法是使用 AlertDialog 并将其设置为 DatePicker 我的代码是 AlertDialog Builder builder new AlertDialog Builder this DatePicker picker n
  • PLCrashReporter - 如何符号化进程中的崩溃数据?

    在我们获得崩溃数据后 有没有办法对崩溃报告进行符号化 目前 这就是我在handleCrashReport方法中所做的事情 PLCrashReportTextFormat textFormat PLCrashReportTextFormati
  • Android 在 Google 地图中进行捏合缩放

    谷歌地图中的捏缩放功能是否可行 我进行了多次搜索但没有得到任何解决方案 请给出您的看法 或者需要编写api来实现这些功能 您是否使用 ScaleGestureDetector 来实现捏合和缩放 http developer android
  • 我的 Android 设备上的多个编码器支持 Mime 类型视频/avc

    当我枚举设备上的所有媒体编解码器时 我注意到以下编码器支持 mime 类型 video avc OMX qcom video encoder avc OMX google h264 encoder 你打电话时MediaCodec Creat
  • 如何高效找到重叠区间?

    我有以下玩具示例数据框 df f low f high 0 476201 0 481915 0 479161 0 484977 0 485997 0 491911 0 503259 0 508679 0 504687 0 510075 0
  • 尝试在 C# 中的 UInt16 上执行按位非 (~) 时出错

    出于某种原因 我根本不理解 或不明白 为什么这是有效的 UInt32 a 0x000000FF a UInt32 0x00000001 但这并没有 UInt16 a 0x00FF a UInt16 0x0001 它给出错误 常量值 某些数字
  • 如何处理 上的点击而不是子元素上的点击?

    我用以下代码处理点击 带输入的表 table tr td td tr table
  • sass 会损害性能吗?

    我一直在教育自己 阅读this http code google com speed page speed docs rendering html 引擎从右到左评估每个规则 从最右边的选择器 称为 键 开始并遍历每个选择器 直到找到匹配或丢
  • 如何为 Windows Phone 8 应用程序创建图表/图形? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在Windows Phone 8 应用程序 图表 图表 http img837 imageshack
  • 使您的 .NET 语言在调试器中正确运行

    首先 我对这个问题的长度表示歉意 我是作者钢铁计划 http ironscheme codeplex com 最近 我一直在努力发出合适的调试信息 以便我可以使用 本机 NET 调试器 虽然这取得了部分成功 但我遇到了一些初期问题 第一个问
  • AJAX HTML PHP 问题

    这是我的scripts js function showHint str if str length 0 document getElementById txtHint innerHTML return if window XMLHttpR
  • Haskell 中的链接/组合类型类

    假设我有两个定义如下的类型类 它们的功能相同但名称不同 class Monad m where gt gt m a gt a gt m b gt m b return a gt m a class PhantomMonad p where