如何使用Data.Functor.Invariant?

2023-12-13

有人可以给我举个例子吗

invmap :: (a -> b) -> (b -> a) -> f a -> f b  

Invariant 有什么用呢?


大多数情况下,人们don't use Invariant。您想要这样做的原因是,如果您正在使用其中变量同时出现在协变和逆变位置的类型。

newtype Endo a = Endo {appEndo :: a -> a}
newtype Foo a = Foo (Maybe a -> IO a)
data Bar a = Bar [a] (a -> Bool)

这些都不是实例Functor or Contravariant,但它们都可以是Invariant.

人们很少打扰的原因是,如果您需要对这种类型进行大量映射,通常最好将其分解为协变和逆变部分。每个不变函子都可以表示为Profunctor:

newtype FooP x y = FooP (Maybe x -> IO y)
data BarP x y = Bar [y] (x -> Bool)

Now

Endo a ~= (->) a a
Foo a ~= FooP a a
Bar a ~= BarP a a
-- So we'd likely write newtype Bar a = Bar (BarP a a)

如果您打开包装,通常会更容易看到发生了什么newtype, dimap超过底层的Profunctor,然后再把它包起来,而不是乱搞invmap.


我们怎样才能改变一个Invariant函子变成Profunctor?首先,让我们处理总和和乘积。如果我们可以转身f and g转化为函子fp and gp,那么我们肯定可以转f :+: g and f :*: g转换成等价的函子和和乘积。

那么作曲呢?这有点棘手,但不多。假设我们可以转f and g转化为函子fp and gp。现在定义

-- Compose f g a ~= ComposeP fp gp a a
newtype ComposeP p q a b = ComposeP (p (q b a) (q a b))
instance (Profunctor p, Profunctor q) => Profunctor (ComposeP p q) where
  dimap f g (ComposeP p) = ComposeP $ dimap (dimap g f) (dimap f g) p

现在假设你有一个函数类型;f a -> g a。这看起来像fp b a -> gp a b.

我认为这应该涵盖大多数有趣的案例。

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

如何使用Data.Functor.Invariant? 的相关文章

随机推荐

  • 如何在audioPlayerDidFinishPlaying方法中多次播放()

    当我按 yourButton 或 yourButton2 或 yourButton3 时 每个都会播放一个音频文件 并且在播放音频时 UIButton 被设置为选中 我希望 yourButton4 连续实现其他 UIButton 的方法 首
  • Android Studio - JDK 问题、Android Studio 崩溃

    当我将 Java JDK 8 从 Update 40 更新到 45 后 我的所有项目打开时都出现错误 你知道 代码上的红色字母 当我点击 Alt Enter 时 它显示 Setup JDK 我尝试卸载 Java 和 Android Stud
  • iOS/Swift UIImageView (.jpg) 无法识别我的点击手势?

    我有一个简单的代码块 可以在我的图像被点击时播放声音 然而 当我点击我的图像时 点击甚至无法被识别 我相信这是真的 因为在点击图像时 handleTap 函数中的 println 不会打印任何内容 谁能给我一些关于问题可能出在哪里的见解 v
  • 为什么这个 XPath 表达式在 xmlstarlet 中没有返回正确的值?

    我正在尝试使用 xmlstarlet 提取此 KML 文件中 坐标 节点的内容 KML 文件使用 xmlstarlet 本身可以很好地验证 我将其缩减为一个小测试文件 其中包含
  • 在 Spring Boot 测试中加载不同的 application.yml

    我正在使用一个 Spring Boot 应用程序来运行我的src main resources config application yml file 当我通过以下方式运行测试用例时 RunWith SpringJUnit4ClassRun
  • MpAndroidChart Piechart 图例在底部中心切割问题

    我已附上截屏我的使用图表 红色框中显示传说 他们正在饼图上切割 下面是我的代码 pieChart setUsePercentValues false pieChart getDescription setEnabled false pieC
  • 使用 Chrome 语音识别有任何限制吗?

    我想在我的商业网络应用程序中使用 webkit speech recognition 是否有任何限制 网站查询限制 禁止商业用途 5分钟 300秒 后有超时 虽然我找不到任何文档
  • Python 骰子模拟

    我对模拟掷骰子的家庭作业有点困惑 问题要求创建一个返回 1 到 6 之间的随机整数值的函数 并创建一个主程序 询问用户要掷多少个骰子 必须限制为 5 个骰子 并调用该函数来打印生成的骰子价值观 到目前为止我有这个 import random
  • 如何从列表中获取不同的数据?

    我想要得到distinct人员名单中的名单 List
  • 从 MySQL 中的多个表中删除行

    我正在尝试从projects表以及与该项目相关的所有图像images table 可以说p id 10 DELETE FROM projects images WHERE projects p id AND images p id 这个查询
  • 我们可以用 C# 中的带有默认方法的接口替换抽象类吗

    在 C 8 0 中 我们有一个新功能 可以在接口中提供默认方法实现 该方法也可以被其实现类覆盖 我们曾经使用带有实例方法的抽象类来为其所有实现类提供通用功能 现在我可以将那些具有实例方法的抽象类替换为具有 C 8 0 中的默认方法实现的接口
  • 如何复制/克隆整个 Google App Engine 项目

    我想知道是否有任何方法可以克隆谷歌应用程序引擎项目 我找不到任何与此相关的帮助 尽管人们经常需要此功能 假设我开始开发一个应用程序引擎应用程序 配置了如此多的选项 api 现在它将成为我的临时项目 我想要一个单独的生产项目 设置具有相同设置
  • sqlalchemy.exc.NoSuchModuleError:无法加载插件:sqlalchemy.dialects:bigquery

    尝试使用 sqlalchemy 创建 bigquery 连接器 from sqlalchemy import create engine engine create engine bigquery
  • Delphi 2010 对象检查器网格和 Windows dpi

    我在高分辨率宽屏上工作 并将 dpi 设置为 144 这样我可以更好地看到字体 Delphi 2010 对象检查网格中的问题我看不到属性或事件名称的文本 网格无法缩放 有什么解决办法吗 thank 读完你的文章后 我问 Uwe Schust
  • 通过字符串名称访问变量值(groovy)

    我做了一些研究 但还没有找到适合我的案例的工作代码 我有两个名为test and test2我想将它们放入以下格式的地图中 test valueof test test2 valueof test2 我的一段代码如下 def test HE
  • 如何将智能表“st-search”与 ng-model 集成?

    如何在Smart Table上设置不考虑用户输入的输入搜索值 这是我的代码 当用户单击复选框时 输入字段会自动输入 Sam 但表记录不会被过滤 并更新 这是我的代码 div class container table class table
  • Codeigniter:在非对象上调用成员函数 result_array()

    我正在使用 Codeigniter 构建 web 应用程序 但收到此错误 Fatal error Call to a member function result array on a non object in var www appli
  • 在其他下拉菜单中选择后禁用下拉选项

    我有 12 个下拉输入区域 一年中的每个月份都有 1 个 每个下拉菜单都有相同的 24 个选项 我需要这样做 例如 如果您在 一月 下拉框中选择了选项 4 则无法在任何其他下拉菜单中选择该选项 4 它仍然在下拉列表中 但只是被禁用 这将有一
  • ID 令牌中缺少 Azure AD v2.0 特定的可选声明

    我正在尝试使用 Microsoft Identity Web NuGet 添加可选声明 以在 NET Core 3 1 WebApp 中进行用户身份验证 阅读 MS 文档 似乎唯一需要的步骤是在 Azure 中的应用程序注册清单文件中声明可
  • 如何使用Data.Functor.Invariant?

    有人可以给我举个例子吗 invmap a gt b gt b gt a gt f a gt f b Invariant 有什么用呢 大多数情况下 人们don t use Invariant 您想要这样做的原因是 如果您正在使用其中变量同时出