在 Haskell 中重新排序类型参数

2024-03-03

我有一个关于类型参数的问题,我认为最好通过示例来表达。这段代码

newtype Triple a b c = T (a,b,c)

instance Functor (Triple a b) where
    fmap f (T (x, y, z)) = T (x, y, (f z))

将三元组表示为第三个变量中的函子。

  1. 我如何将它们变成第二个变量中的函子?
  2. 我如何将实际的元组(不是我的新类型)变成函子?

一般问题是:假设我有一个参数类型m a b c d e如何表达参数类型m a b d e通过固定一个参数来获得?或者等效地,我如何表达参数类型m a b d e c通过将任意参数设为最后一个参数来获得?

编辑:可能还不太清楚我的意思,所以我试图澄清:Triple有善良* -> * -> * -> *。所以我可以部分评估两种类型以获得某种东西* -> *这可能是Functor或其他一些参数化类。这种评估在前两个参数上很容易完成,但原则上在任何两个参数上都是可能的,我问的是如何做到这一点。这本质上是要求flip在类型层面上。

作为一个具体的用例,我可以拥有三个参数化类 Functor、Foo 和 Bar,并且我希望 (Triple _ b c) 成为 Functor,(Triple a _ c) 成为 Foo,(Triple a b _) 成为a Bar(对于所有 a、b、c)。那么那么Triple a b c将是一个Functor, a Foo and a Bar。您会考虑编写这些单参数类型a -> Triple a b c, b -> Triple a b c and c -> Triple a b c当然,这种文字表示法表示映射类型。

Edit2:在 stackoverflow 上发布问题之前,我总是尝试将其剥离到其抽象核心,但这似乎掩盖了我真正想要的东西。所以现在可以找到这个问题的具体变体here https://stackoverflow.com/questions/60079676/partially-evaluated-type-in-classes.


这就是新类型的用途。您可以将现有类型包装在新类型中,从而可以在类型级别对其执行不同的操作,同时保持值级别不变。例如:

newtype SecondTriple a b c = SecondTriple (a, c, b)

instance Functor (SecondTriple a b) where
  fmap f (SecondTriple (x, z, y)) = SecondTriple (x, f z, y)

如果你愿意,你可以包裹 Triple 而不是包裹(,,),但是当然你无论如何都不能使用 Triple 的 Functor 实例,所以它没有太大帮助。

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

在 Haskell 中重新排序类型参数 的相关文章

  • 为什么 Python 布尔值占用超过一个字节?

    显然 Python 中整数占用 24 个字节 我可以理解 它这样做是因为代表无限数字的额外花哨 然而 布尔数据类型看起来也花费了高达 24 个字节 尽管它只能表示两个可能值之一 为什么 除了 1 位表示之外 还可能需要存储哪些额外数据Tru
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • Haskell:找不到模块“Data.List.Split”

    我正在尝试在 Haskell 中拆分列表 据我所知 最简单的方法是splitOn 但是这个函数需要Data List Split 所以我尝试运行import Data List Split在前奏曲中 但是 我收到以下错误 Could not
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • 如何从 haskell 中的 IOError 获取 errno?

    我在 haskell 平台上 GHC 6 12 1 作为 apt get 安装在 Debian Squeeze 上 鉴于我需要在与最初引发它的线程不同的线程上使用它 如何从 IOError 中获取底层 errno 我需要这个的原因是因为我正
  • 如何在一列中存储数组或多个值

    运行 Postgres 7 4 是的 我们正在升级 我需要将 1 到 100 个选定项目存储到数据库的一个字段中 98 的情况下 只会输入 1 个项目 而 2 的情况下 如果是这样的话 会输入多个项目 这些项目只不过是文本描述 截至目前 长
  • 映射存在类型列表

    我有一个要映射的存在类型对象的列表 像这样的东西 sealed abstract class IntBox val v Int case object IB1 extends IntBox 1 case object IB2 extends
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • Scala Function.tupled 和 Function.untupled 等效于变量 arity,或者使用元组调用变量 arity 函数

    昨晚我试图围绕接受和调用通用函数做一些事情 即类型在调用站点上已知 但可能因调用站点而异 因此定义应该是跨参数通用的 例如 假设我有一个函数f A B C gt Z 其实这样的还有很多fs 我事先不知道 所以我无法确定类型或数量A B C
  • Haskell 下划线与显式变量

    我已经学习 Haskell 几个星期了 我有一个关于下划线的使用的问题 作为函数参数 我认为用一个具体的例子来问我的问题会更好 假设我想定义一个函数 根据提供的索引提取列表的元素 是的 我意识到 已经是预先定义的 我可以定义该函数的两种方法
  • 什么是欣德利米尔纳?

    我遇到过这个词欣德利 米尔纳 我不确定是否理解它的意思 我已阅读以下帖子 史蒂夫 叶格 动态语言的反击 http steve yegge blogspot com 2008 05 dynamic languages strike back
  • Java 泛型 - 重写抽象方法并具有子类的返回类型

    我正在尝试创建一个设置 其中一组子类覆盖超类 这个超类包含一个抽象方法 理想情况下 其返回类型是调用该方法的对象的返回类型 这样它的有效行为如下 public abstract class SuperClass public abstrac
  • “Eta减少”并不总是在Haskell中举行?

    我发现我可以说 LANGUAGE RankNTypes f1 forall b b gt b gt forall c c gt c f1 f id f HLint 告诉我我可以在这里做 Eta 减少 但是 f2 forall b b gt
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • 二维数组的 MPI 数据类型

    我需要将一个整数数组的数组 基本上是一个二维数组 从根传递给所有处理器 我在 C 程序中使用 MPI 如何声明二维数组的 MPI 数据类型以及如何发送消息 我应该使用广播还是分散 你需要使用播送 http www netlib org ut
  • 如何使 PyCharm 从函数定义中获取类型提示并在文档字符串中填充类型值?

    我总是在函数定义中使用类型提示 例如 def foo a int b str gt bool pass 当我使用 PyCharm 自动文档字符串生成器在代码中生成文档字符串时 我得到以下信息 def foo a int b str gt b
  • C++ 强制转换运算符重载 [重复]

    这个问题在这里已经有答案了 我有一个只有一个 int 成员的类 例如 class NewInt int data public NewInt int val 0 constructor data val int operator int N
  • 为什么这些类型参数不符合类型细化?

    为什么此 Scala 代码无法进行类型检查 trait T type A trait GenFoo A0 S lt T type A A0 trait Foo S lt T extends GenFoo S A S 我不明白为什么 类型参数
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t

随机推荐

  • 使用 BeautifulSoup 抓取 Instagram

    我正在尝试从 Instagram 中的 按标签搜索 获取特定字符串 我想从这里获取 url img img alt
  • TemplateDoesNotExist 位于/base/index.html

    我正在学习 Django 并正在构建一个登陆页面 我收到 TemplateDoesNotExist 错误 我想我知道原因 但我不知道如何解决此问题 我的index html is in coffeedapp coffeedapp templ
  • NSURLSessionUploadTask 未将文件传递给 php 脚本

    编辑 好的 我只是将内容类型标头设置为 multipart form data 没有区别 我原来的问题如下 这是我关于堆栈溢出的第一个问题 我希望我做得对 我刚刚学习 Objective C 最近完成了斯坦福大学在线版本的课程 我对 php
  • php 中的电子邮件 div 内容

    是否可以获取特定下的内容 div 并通过电子邮件发送该内容 例如 如果我有这样的事情 div ul li a li li b li ul ul ul div 基本上我只想参考 div 并获取全部内容并通过电子邮件发送 有什么办法可以缓存di
  • 如何在 WebView 中处理基本身份验证

    我创建了一个加载 WebView 的应用程序 为了登录 该网站需要基本身份验证 当我尝试访问该网站时 通过默认浏览器 我会收到一个弹出框 提示我输入我的用户名 和密码 如果我尝试通过我的应用程序访问该网站 我会收到错误 401 并且没有弹出
  • 尝试启动 docker 时不断出现无法读取 CA 证书

    我正在尝试从 boot2docker 迁移到 docker machine 我按照指示进行操作here http docs docker com mac step one 安装 docker 但我不断收到以下消息 Could not rea
  • 初始化逻辑(例如大量单例)应该在 OnCreate 还是 OnResume 中吗?

    假设我有一个带有通用定位控制器 电池控制器 AppSateController 等 inilizations 方法的单例 这些是否应该在 onResume 中而不是 OnCreate 中 因为 OnCreate 在每次旋转 每次更改为前台时
  • 如何通过javascript访问数据库?

    我正在创建一个管理页面 其中有多个文本框 当我在一个文本框中输入用户 ID 时 我想在管理员移动到下一个文本框时在下一个文本框中显示用户名 为此我可以使用ajax or javascript 哪一个会更好 我怎样才能通过javascript
  • Angular,内容类型未通过 $http 发送

    Angular 没有添加正确的内容类型选项 我尝试了以下命令 http url http localhost 8080 example teste dataType json method POST headers Content Type
  • 注意:第 18 行 C:\Program Files (x86)\EasyPHP-Devserver-17\eds-dashboard\index.php 中的未定义偏移量:3

    我安装了 EasyPHP deverser 17 并且运行良好几个月了 今天 没有任何原因 我的意思是没有更改任何内容 我在打开仪表板时收到以下错误消息 注意 第 18 行 C Program Files x86 EasyPHP Devse
  • “警告:链接共享库与静态库不可移植”是什么意思?

    我正在使用 libmxml a 库的某些函数来创建一个动态库 但我收到此警告 Warning Linking the shared library libgstmatroskademux la against the static libr
  • 实体框架断开连接的图形和导航属性

    我正在使用 Entity Framework 6 Code First 和 Fluent API 我在 Visit 和 VisitPage 之间有一对多关系 1 个 Visit 有许多 VisitPage 对象 这是 POCO 类的简化版本
  • 从 XML 文件中删除标头的简单方法

    我需要从另一个程序生成的文件中删除非 xml 标签 该文件是这样的 Executing Command Blah exe Command Output HTTP 1 1 200 OK Connection close Content Typ
  • Mysql语句(FULL JOIN语法错误)

    我的 sql 语句出了什么问题 它说问题出在 FULL JOIN 附近 但我很困惑 SELECT o name AS offername m name AS merchantName FROM offer AS o FULL JOIN of
  • 如何在没有虚拟化的 Macintosh 上进行“干净”测试?

    我在 Windows 上遇到的一件事是 当您正在开发的 Web 浏览器插件或程序假设安装了默认情况下并不总是存在于 Windows 上的某些内容时 一个完美的例子是 NET 很多运行 Windows XP 的人从未安装过任何版本的 NET
  • 更改列表视图中的颜色线

    如何更改列表视图中的颜色线 例如if line 4 then line is red 如果您想浏览整个列表并有条件地为每个项目着色 那么您可以使用 foreach ListViewItem lvw in myListView Items i
  • Jquery ui - 自动完成 - UTF8 字符集

    我正在处理这个 jquery 数据输入表单 其中我需要使用来自 mysql 的数据自动完成特定字段 我一切正常 自动完成通过 php 从 sql 检索数据 英语 拉丁字符的匹配非常好 问题是 当我输入希腊语时 我只得到区分大小写的匹配项 如
  • 如何在 git 中共享配置文件?

    我有想要在所有存储库中传播的编辑器设置 如果用户定义了自己的设置 那么它当然应该删除存储库选择 我想这样做 因为我有一个班级 每个学生都克隆该存储库 通常他们会忘记设置 core editor 设置并最终乱搞 vi 通常会导致仓库崩溃 就像
  • 压缩图像和调整图像大小有什么区别?安卓

    在我的 Android 应用程序中 我想将图像上传到服务器 解决服务器不接受大于2M图片的问题 但用户可以选择大于2M的图片 所以我想构建一个代码 使图像小于2M 我有两种方法 调整图像尺寸 如下 public static Bitmap
  • 在 Haskell 中重新排序类型参数

    我有一个关于类型参数的问题 我认为最好通过示例来表达 这段代码 newtype Triple a b c T a b c instance Functor Triple a b where fmap f T x y z T x y f z