我们可以对类型类进行抽象吗?

2024-02-24

我想知道我们不能对类型类进行抽象是否有更深层次的原因(或者我们可以吗?)。

例如,当我们有

fzip :: (forall a.[a] -> [a]) -> [b] -> [c] -> [(b,c)]
fzip f xs ys = zip (f xs) (f ys)

那么我们可以说

fzip (drop 42) [1..100] ['a'..'z']
fzip reverse   [1..100] ['a'..'z']

等等。但我们不能

fzip (map succ) [1..100] ['a'..'z']

我们可以用以下方法修复:

ezip :: (Enum b, Enum c) => (forall a.Enum a => [a] -> [a]) -> [b] -> [c] -> [(b,c)]
ezip f xs ys = zip (f xs) (f ys)

同样我们可以修复

fzip (map (5*)) [1..100] [1.5, 2.3, 4.7]

with

nzip :: (Num b, Num c) => (forall a.Num a => [a] -> [a]) -> [b] -> [c] -> [(b,c)]
nzip f xs ys = zip (f xs) (f ys)

但我们不能包容,这不是很尴尬吗?ezip and nzip类似的东西:

gzip :: (g b, g c) => (forall a. g a => [a] -> [a]) -> [b] -> [c] -> [(b,c)]

尽管代码是完全相同的,但直到类的名称? 或者我们能以某种方式吗?

有趣的是,当实例只是包含函数的记录时,这很容易实现。


You can almost这样做ConstraintKinds:

{-# LANGUAGE ConstraintKinds, RankNTypes #-}

import Data.Proxy

gzip :: (g b, g c) => Proxy g -> (forall a . g a => [a] -> [a]) -> [b] -> [c] -> [(b,c)]
gzip _ f xs ys = zip (f xs) (f ys)

test1 = gzip (Proxy :: Proxy Enum) (map succ) [1 .. 100] ['a' .. 'z']
test2 = gzip (Proxy :: Proxy Num) (map (5*)) [1 .. 100] [1.5, 2.3, 4.7]

主要区别在于您需要Proxy论点,因为 GHC 无法推断出正确的实例化g不靠别人帮助。

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

我们可以对类型类进行抽象吗? 的相关文章

随机推荐

  • 在整个 oracle 数据库中搜索字符串的一部分

    我正在尝试在整个 Oracle 数据库中查找特定字符串 我已经按照此处另一个主题中的示例进行了操作 在所有表中的所有字段中搜索特定值 Oracle https stackoverflow com questions 208493 searc
  • Android - Espresso 测试 - 关闭应用程序然后重新打开它?

    在我的浓缩咖啡测试中 我使用 device pressBack 关闭应用程序 然后我想在某个活动中重新打开应用程序 但我不太确定该怎么做 因为此时我什至没有上下文 有人有想法吗 好的 我知道了 您在测试类中定义规则 Rule public
  • Visual Studio 的“自动解析”功能不适用于扩展方法 - 现在怎么办?

    我喜欢视觉工作室中的 解决 功能 典型场景 Type in Debug Type 请注意 没有出现智能感知 右键点击 选择解决 Choose using System Diagnostics or System Diagnostics De
  • 通过依赖注入使用 Blazor Webassemble 进行 gRPC-Web 通道身份验证

    我正在 Blazor Web assembly 中通过身份验证测试 gRPC Web 并在如何干净地访问我的 gRPC 通道方面遇到了一些障碍 无需身份验证 有一种非常简单明了的方法 如 grpc dotnet 的 Blazor 示例中详细
  • 如何在有条件的字符串之间添加字符

    如果字符串中存在 20 则必须用 OR 替换 abc 20 def 预计出 gt abc OR def if 字符串中必须替换为 OR abc def Expected out gt abc OR def string abc def 需要
  • 简单的 Flask/gevent 请求没有同时运行

    我有这个简单的 Flask gevent 演示代码 usr bin env python import gevent from gevent pywsgi import WSGIServer from gevent import monke
  • 如何使用CSS创建没有图像的纹理纸背景[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有没有办法使用 CSS 创建没有图像的背景 颜色和纹理 正如达斯汀所说 CSS 不存在 纹理 功能 然而 如果你使用 CSS3 你可以
  • Facebook sdk 在应用程序委托中崩溃

    以下是我复制该错误的方法 这是我用于登录的代码 IBAction func FBLoginAction sender AnyObject fbLoginManager loginBehavior FBSDKLoginBehavior bro
  • 由于 Web 部署而将绝对路径更改为相对路径(Python - Flask)

    我创建了一个可以在本地运行的应用程序 我想将其部署到 Heroku 当我部署它时 我在 Heroku 日志中收到错误 提示找不到我在脚本中指定的文件夹 正如预期的那样 它们是绝对路径 我正在尝试做出改变 但没有一个有效 我在服务器端使用 F
  • 如何在 iOS SDK 中为用户提供预先编写的 SMS 消息

    我使用 Apple Dev 网站上的示例代码来学习如何设置预写电子邮件 但是有没有办法类似地设置预写短信 首先你必须添加框架MessageUI到您的项目并导入库 MessageUI MessageUI h 然后遵守协议
  • Android - 将视频/音频文件上传到 Firebase 存储

    我正在使用 Firebase 存储来保存视频 音频用户的文件 我的主要想法是将每个视频 音频保存在用户 ID UID 下 这意味着每个用户在其 UID 下保存有多个视频 音频文件 我写了一个代码 问题是他不断将新视频保存在我保存的旧视频上
  • JavaFX 菜单栏中的菜单右对齐

    In Java Swing可以使用以下方法将菜单放在菜单栏的右侧 menubar add menu1 menubar add Box createHorizontalGlue menubar add menu2 这将把menu1在左边和me
  • 如何播放 MP3 文件? [复制]

    这个问题在这里已经有答案了 我正在尝试访问MP3 http en wikipedia org wiki MP3音频文件保存在我的源文件夹中 以便我可以在 Java 程序 应用程序 而不是小程序 中播放它 我似乎遇到的问题是我无法导入java
  • HTML5在画布上拖放路径,无需JS库

    我想在 HTML5 画布上拖放路径 如果我们点击形状 我没有发现任何类似 SVG 提供事件的东西 有人知道我如何在这里处理路径项上的事件吗 我想在没有任何java脚本库的情况下做到这一点 以下是我当前绘制路径的代码 var canvas d
  • MongoDB索引定义策略

    我有一个基于 MongoDB 的数据库 里面有大约 100K 到 500K 文本文档 并且该集合不断增长 系统应支持文档不同字段的查询 例如 标题 类别 重要性等 该系统是一个近乎实时的系统 每 5 10 分钟就会获取新文档 为了提高查询性
  • 引用具有动态工作表名称的另一个工作簿

    我想引用另一个工作簿和一个依赖于某些单元格值的特定工作表 这个方程有效 S 停机时间 11 Nov 2013 Downtime Tracker xls 30 F 12 但值 Nov 和 30 是动态的 它们分别取决于 D13 和 E13 的
  • C getopt 多个值

    我的论点是这样的 a out i file1 file2 file3 我该如何利用getopt 获取 3 个 或更多 输入文件 我正在做这样的事情 while opt getopt argc argv i xyz 1 case i inpu
  • 如何从范围滑块获取多个值 - bootstrap-slider.js

    我正在使用 bootstrap slider js http www eyecon ro bootstrap slider http www eyecon ro bootstrap slider 给我范围滑块功能 我在一页上有 9 个滑块
  • 删除seaborn线图图例标题

    我想从我的seaborn lineplot 图例中删除标题 我尝试使用这个答案 https stackoverflow com a 45335602 2970186无济于事 import matplotlib pyplot as plt i
  • 我们可以对类型类进行抽象吗?

    我想知道我们不能对类型类进行抽象是否有更深层次的原因 或者我们可以吗 例如 当我们有 fzip forall a a gt a gt b gt c gt b c fzip f xs ys zip f xs f ys 那么我们可以说 fzip