如何使用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? 的相关文章

  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n
  • 如何打乱列表?

    如何从一组数字 1 2 3 直到我击中x 我的计划是重新调整列表 1 2 3 并把它砍在x chopAt 3 2 3 1 2 3 chopAt 3 2 1 3 2 1 3 chopAt 3 3 1 2 3 chopAt chopAt x y
  • C++ 概念与 Haskell 类型类有何不同?

    Concepts TS 中的 C 概念最近已合并到 GCC 主干中 概念允许人们通过要求类型满足概念的条件 例如 可比较 来约束通用代码 Haskell 有类型类 我对 Haskell 不太熟悉 概念和类型类如何相关 概念 由概念 TS 定
  • 迭代打印列表中的每个整数

    假设我有一个整数列表l 1 2 我想打印到stdout Doing print l产生 1 2 假设我想打印不带大括号的列表 map print l产生 No instance for Show IO arising from a use
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • 关于“没有绑定的类型签名”的错误

    我在 Haskell 中遇到 ASCII 问题 fromEnum Char gt Int toEnum Int gt Char offset Int offset fromEnum A fromEnum a toUpper Char gt
  • 在另一个字符串中查找子字符串的索引 Haskell

    我要创建一个带有两个参数 字符串 的函数 该函数应查看第一个参数是否是第二个参数的子字符串 如果是这种情况 它将返回每个出现的元组 其中包含子字符串的起始索引和子字符串的结尾索引 例如 f String gt String gt Int I
  • 约束包如何工作?

    背后的想法数据 约束 Forall http hackage haskell org packages archive constraints 0 3 2 doc html src Data Constraint Forall html据我
  • RankN多态性和令人发指的克莱斯利之箭

    我不明白为什么 demobind1 的定义会产生一些编译器错误 它看起来像一个愚蠢的翻转 但不知何故 LANGUAGE GADTs LANGUAGE RankNTypes ScopedTypeVariables TypeOperators
  • 在 Haskell 中获取玫瑰树的根

    最近我开始学习 Haskell 并在以下练习中遇到困难 Write functions root Rose a gt a and children Rose a gt Rose a that return the value stored
  • Control.Parallel.Strategies 中 Eval 的绑定运算符如何严格评估其参数?

    Control Parallel Strategies 的源代码 http hackage haskell org packages archive parallel 3 1 0 1 doc html src Control Paralle
  • Haskell:对 Num 类型类的使用感到困惑

    我很困惑为什么这有效 f Num a gt a gt a f x x 42 但这并没有 g Num a gt a gt a g x x 4 2 我本来就明白Num包含实现运算符的所有类型 因此 如果42 is an Int and 4 2
  • Haskell 点运算符

    我尝试在 Haskell 中开发一个简单的平均函数 这似乎有效 lst 1 3 x fromIntegral sum lst y fromIntegral length lst z x y 但是为什么下面的版本不行呢 lst 1 3 x f
  • Data.Array 有多快?

    The 文档 http haskell org ghc docs latest html libraries array 0 3 0 3 Data Array html of Data Array reads Haskell 提供了可索引数
  • 使用 Haskell 绘制图表

    是否可以使用 Haskell 绘制一个简单的图表 你们中的任何人都可以告诉我该怎么做吗 该图应至少包含 3 个点 Haskell 图表 https github com timbod7 haskell chart似乎不错 The wiki
  • 如何让 esqueleto 为我生成 SQL 字符串?

    我怎样才能让esqueleto从a生成一个SQL字符串from陈述 的文档toRawSql说 你可以打开持久的查询日志记录 我尝试了所有可能的形式MonadLogger我可以理解 但它从未打印任何 SQL 同一文档还说 手动使用此功能 是可
  • 检索 Haskell 项目中所有导入的列表

    因此 我的最终目标是通过确保项目导入的所有实体都存在于其声称可以使用的版本中 来评估 cabal 文件中依赖项的准确性 一个好的开始是找到单个源文件使用的所有导入实体的列表 可选地包含有关它们来自何处的信息 我愿意暂时忽略类实例的情况 因为
  • Haskell 为替代的 Either 数据类型定义 Functor 实例

    通过 Typeclassopedia 获得一些使用类型类的路由 想要替代Either的一个实例Functor 但即使检查定义Either作为一个例子Functor总是给我带来麻烦 有这个 但不会编译 data Alt a b Success
  • Cabal:使用源代码构建目录

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

    我是 Haskell 的新手 刚刚进入惰性世界编程 我读到seq函数非常特殊 因为它强制使用严格的评估 以便在某些情况下更加有效 但我就是找不到什么seq代表字面意思 也许严格评估Q 它应该提醒您 顺序 或 顺序 因为它允许程序员指定其参数

随机推荐

  • 如何在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 您想要这样做的原因是 如果您正在使用其中变量同时出