可与类型索引中的和和积合并

2023-12-29

Haskell 中是否有类似于以下类型类的内容?

class Mergeable (f :: Type -> Type -> Type) where
  merge :: f a b -> f c d -> f (a, c) (Either b d)

特别是,想象有一个Site在某些值和路线上建立索引的类型:

data Site a r 

我们想要“合并”两个站点,这样both他们的数据(值)保存在内存中,同时支持either他们的路线。

instance Mergeable Site where 
  merge site1 site2 = ...

还有另一种类型,称为RouteEncoder a r具有相同的类型形状。所以我想我应该在这里寻找一个共同的模式......


EDIT:按要求提供 Site 和 RouteEncoder 的完整类型定义:

data Site a r = Site
  { siteName :: Text,
    siteRender ::
      Some CLI.Action ->
      RouteEncoder a r ->
      a ->
      r ->
      Asset LByteString,
    -- | Thread that will patch the model over time.
    siteModelData :: ModelRunner a,
    siteRouteEncoder :: RouteEncoder a r
  }

type RouteEncoder a r = PartialIsoEnumerableWithCtx a FilePath r

-- | An Iso that is not necessarily surjective; as well as takes an (unchanging)
-- context value.
--
-- Parse `s` into (optional) `a` which can always be converted to a `s`. The `a`
-- can be enumerated finitely. `ctx` is used to all functions.
-- TODO: Is this isomrophic to `Iso (ctx, a) (Maybe a) s (ctx, s)` (plus, `ctx -> [a]`)?
data PartialIsoEnumerableWithCtx ctx s a
  = PartialIsoEnumerableWithCtx (ctx -> a -> s, ctx -> s -> Maybe a, ctx -> [a])

完整上下文的代码可以在这个 PR 中看到:https://github.com/srid/ema/pull/81/files https://github.com/srid/ema/pull/81/files(也可以看看PartialIsoFunctor哪个类可能也应该被简化)。


假设的理解:协变函子和逆变函子之间的区别,以及延伸而来的双函子和泛函子之间的区别

摘要:您想要一个适用且可替代的双函子,或者一个从可整除到可替代的函子,具体取决于它是双函子还是函子

函子 f 可以采用 'f' 的关联对(又名积、元组)并返回对的 f,被称为 applicative(嗯,它是来自 'semigroupoids' 的 Apply 类型类,applicatives 也需要一个单位)

也就是说,f配备:

pair :: f a -> f b -> f (a,b)
pair = liftA2 (,)

pairUnit :: f ()
pairUnit = pure ()

选择的等效项(也称为求和)与替代函子类似地相关(它是“semigroupoids”中的 Alt 类型类):

pick :: f a -> f b -> f (Either a b)
pick fa fb = fmap Left fa <|> fmap Right fb

pickUnit :: f Void
pickUnit = empty

关于应用和替代(无单位)的这两种表述值得注意的是,它们并不是整个故事:还有逆变应用函子和逆变替代函子,它们分别是来自“逆变”的 Divisible 和 Decidable 类型类

应用函子知道如何将部分组合成整体,可分函子知道如何将整体分割成部分

pairCovariant :: ((a,b) -> c) -> f a -> f b -> f c
pairCovariant f fa fb = fmap f (pair fa fb)

-- liftA2 f = pairCovariant (curry f)

-- this is also called 'divide'
pairContravariant :: (c -> (a,b)) -> f a -> f b -> f c
pairContravariant f fa fb = contramap f (pair fa fb)

-- given an inhabitant of a, provide an f a
pure :: a -> f a
pure a = fmap (const a) . pairUnit

-- this is also called 'conquer'
emptyPair :: f a
emptyPair = fmap (const ()) . pairUnit

(请注意pair和zip之间的相似性,以及pairCovariant和zipWith - 它们在不同的服装中是相同的功能,其中zip和zipWith描述了应用列表的ZipList解释)

替代函子知道如何将选项组合成一个整体,可判定函子知道如何将整体拆分为选项

pickCovariant :: (Either a b -> c) -> f a -> f b -> f c
pickCovariant f fa fb = fmap f (pick fa fb)

-- aka choose
pickContravariant :: (c -> Either a b) -> f a -> f b -> f c
pickContravariant f fa fb = contramap f (pick fa fb)

empty :: f a
empty = fmap absurd . pickUnit

-- given proof a is uninhabited, provide an f a
-- aka lose
pureChoice :: (a -> Void) -> f a
pureChoice a = contramap a . pureUnit

所以你希望第一个参数是可应用的/可整除的,第二个参数是可替代的/可判定的,这取决于每个参数的协变/逆变

换句话说:如果它是双函子,则适用且可替代;如果它是泛函数,则可整除且可替代

这里的想法总结: applicative、alternative(无 applicative 超类)、可整除和可判定函子都是同一事物的所有版本,通过在对和选择之间进行选择以及协/逆变而制成

又名,应用程序是成对的单流协变函子,替代品是选择的单流逆变函子,等等

进一步阅读:

  • 关于此处描述的应用族:https://duplode.github.io/posts/divisible-and-the-monoidal-quartet.html https://duplode.github.io/posts/divisible-and-the-monoidal-quartet.html
  • 可整除的函子 -> 适用的:https://hackage.haskell.org/package/product-profunctors https://hackage.haskell.org/package/product-profunctors
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可与类型索引中的和和积合并 的相关文章

  • Control.Arrow 与 Data.Tuple.Extra

    我经常使用以下功能Data Tuple Extra图书馆 first second and both 有等效的 函数Control Arrow 其实我更喜欢Data Tuple Extra因为我完全迷失了文档Control Arrow 使用
  • yesod——密码保护临时站点

    我正在尝试设置 yesod 网络服务器的临时实例 我想知道是否有一些简单的方法可以使整个站点受到密码保护 具体来说 我希望能够提示那些导航到我的网站的人提供凭据 经过身份验证后 它应该像典型站点一样运行 但如果他们无法验证自己的身份 他们就
  • 如何在 Haskell 中枚举递归数据类型?

    这篇博文 http lukepalmer wordpress com 2008 05 02 enumerating a context free language 对于如何使用 Omega monad 对角枚举任意语法有一个有趣的解释 他提
  • 谁能解释一下 GHC 对 IO 的定义吗?

    标题非常自我描述 但有一个部分引起了我的注意 newtype IO a IO State RealWorld gt State RealWorld a 剥离newtype 我们得到 State RealWorld gt State Real
  • 为什么haskell中的递归列表这么慢?

    我对 Haskell 很陌生 我在 Haskell 中定义了一个函数 febs Integral a gt a gt a febs n n lt 0 0 n 1 1 n 2 1 otherwise febs n 1 febs n 2 但是
  • 列表理解:制作列表列表

    你好 我正在尝试在 haskell 中创建一个函数 该函数接受一个数字 a 使用列表 即数字 将其一部分4它会创造 1 1 1 1 1 1 2 1 3 2 2 4 我正在考虑使用列表理解来创建列表 x 然后使用 1 n 中的数字创建更多列表
  • 如何找到仅是 2、3 和 5 的幂的倍数的所有数字的列表? [复制]

    这个问题在这里已经有答案了 I am trying to generate a list of all multiples which can be represented by the form where a b and c are w
  • 处理许多不相关的类型时避免样板

    我正在编写处理以下值的代码语言 扩展 注释 语法 http hackage haskell org packages archive haskell src exts 1 1 4 doc html Language Haskell Exts
  • 在 haskell 中处理 IO 与纯代码

    我正在编写一个shell脚本 我在haskell中的第一个非示例 它应该列出一个目录 获取每个文件大小 进行一些字符串操作 纯代码 然后重命名一些文件 我不确定我做错了什么 所以有两个问题 我应该如何安排这样的程序中的代码 我有一个具体问题
  • 对元组列表进行排序的函数 - Haskell

    抱歉 这个简单的问题只是我对 haskell 非常陌生 我正在尝试编写一个函数 order 它将对另一个函数 Frequency 生成的元组列表进行排序 频率计算列表中不同元素的数量 a给出一个这样的结果 比如 gt 频率 aabbbccc
  • Haskell 错误处理方法

    毫无疑问 Haskell 中有多种机制来处理错误并正确处理它们 错误单子 要么 也许 异常等 那么为什么用其他语言编写容易出现异常的代码比用 Haskell 感觉更简单呢 假设我想编写一个命令行工具来处理命令行上传递的文件 我想 验证提供的
  • 带有查询参数的渲染 url

    无法找到简单问题的解决方案 答案应该是显而易见的 如何在 hamlet 模板中使用查询参数渲染 url I e ItemsR 将生成http localhost 3000 items我如何生成类似的东西http localhost 3000
  • 我应该使用什么递归方案来重复有效的操作,直到其结果符合某些标准?

    也就是说 我要问的是一个循环 effectful Int gt IO Int effectful n do putStrLn Effect show n return n condition 3 final Int gt IO final
  • Haskell 排列库函数 - 请澄清一下?

    这是代码permutationsHaskell 中的函数Data List module permutations a gt a permutations xs0 xs0 perms xs0 where perms perms t ts i
  • Parsec 函数“parse”和类“Stream”的类型签名

    约束条件是什么 Stream s Identity t 下面的类型声明是什么意思 parse Stream s Identity t gt Parsec s a gt SourceName gt s gt Either ParseError
  • 如何使用 Haskell 提交 html 表单

    我知道如何使用http 管道 http hackage haskell org package http conduit 2 1 0包的 simplehttp 从 URL 检索页面 现在如果那样的话怎么办 网页有一个输入文本字段和一个提交按
  • 没有由文字“1”产生的 Num String 实例

    main do putStrLn myLast 1 2 3 4 myLast a gt a myLast x x myLast xs myLast xs 当我尝试运行此代码时 我收到此消息 没有由文字 1 产生的 Num String 实例
  • 是否有适用于 Haskell 或 Scala 等函数式语言的 LL 解析器生成器?

    我注意到明显缺乏用函数式语言创建解析器的 LL 解析器 我一直在寻找但没有成功的理想发现是为 ANTLR 风格的 LL 语法生成 Haskell 解析器 语法的模小数重新格式化 并且令我惊讶的是 每个最后一个解析器生成器都具有函数我发现的语
  • Haskell:从后面访问列表

    今天我开始学习Haskell 我对函数式语言有点陌生 而且我非常喜欢 Haskell 然而 我有一个关于它的设计的问题困扰着我 从我到目前为止的理解来看 访问列表后面的元素似乎比访问前面的元素要复杂得多 类似于xs x where xs a
  • 为什么 Haskell (Hugs) 中的 Show 实例会导致堆栈溢出错误?

    下面是 Haskell 中的多态数据类型 由 Hugs 解释 我正在尝试创建一个 Show for Equality 的实例 实例声明表示 如果类型 a 在 Show 中 则相等 a 在 Show 中 它应该以 a b 的形式打印构造函数

随机推荐

  • 使用 reCAPTCHA 和 ajax....javascript 加载问题

    我试图在我的其中一个表单中实现 reCAPTCHA 但我使用 ajax 作为提交 更具体地说是 ajax updater 原型 一旦我提交并错误检查我的表单 我尝试加载 reCAPTCHA 小部件 在我更新的 div 元素中 它基本上只是调
  • 递归子集和函数

    我们的教授为我们的课程分享了以下有关递归的 Python 代码 这是 子集和 问题的解决方案 我一遍又一遍地阅读它 并尝试使用在线工具检查它并逐步遵循参数 但我根本不明白 我知道代码检查列表 L 的子集是否有可能使总和为 0 但我不明白该函
  • WPF 无法找到资源

    我有一个资源文件和两个视图 该视图使用资源文件
  • 如何检查自定义android是否已root?

    我们购买了一些定制的 Android 平板电脑 我们将把它们用作信息亭平板电脑 为了使我们的自助服务终端应用程序正常工作 该应用程序需要 root 访问权限 如何检查设备是否已正确 root 如果不是的话我该如何root它 表明设备已获得
  • 使用 Pow on Rails 4 进行遥控撬

    我正忙于 最终 升级到 Rails 4 并且遇到了 Pry remote 的问题 Problem 添加时binding remote pry对于我的代码 它会破坏代码 但是当我无法通过键入进入调试器时pry remote 这曾经在运行 Ra
  • 如何检查多维数组是否为空?

    基本上 我有一个多维数组 我需要检查它是否为空 我目前有一个if声明尝试这样做 if empty csv array My code goes here if the array is not empty 虽然 那if statement无
  • 在Android上解密“SunJCE”AES加密数据

    我们需要编写一些 Android 代码来解密从我们的服务器发送的一些数据 我们的服务器团队为我们提供了一些使用 SunJCE 提供程序的示例解密代码 遗憾的是 Android 上不存在该提供程序 Cipher cipher Cipher g
  • mingw C++ 无法编译 j0 函数

    我正在尝试使用 MingW msys2 在 Windows 上编译程序 但由于 j0 函数而失败 在Linux上编译没有问题 当我在编译器上使用 std c 11 标志时 它似乎很讨厌 如何正确编译并打开 std c 11 标志 示例代码
  • jar 内的文件对于 spring 不可见

    All 我创建了一个 jar 文件 其中包含以下 MANIFEST MF Manifest Version 1 0 Ant Version Apache Ant 1 8 3 Created By 1 6 0 25 b06 Sun Micro
  • 基于傅里叶变换创建 iPhone 音乐可视化工具

    我正在为 iPhone 设计一个音乐可视化应用程序 我想通过 iPhone 的麦克风采集数据 对其运行傅里叶变换 然后创建可视化来实现这一点 我能得到的最好的例子是奥里奥图奇 http developer apple com library
  • 从 Android 开始:Java 或 Python (SL4A)

    我刚刚订购了一部 Android 智能手机 并想开始尝试创建自己的应用程序 现在的问题是使用哪种语言 是原生 Java 还是使用 SL4A 以前的 ASE 的 Python 我倾向于使用 Python 因为我比 Java 更了解它 但我想知
  • 401 Unauthorized 与 403 Forbidden:当用户未登录时,哪个是正确的状态代码? [复制]

    这个问题在这里已经有答案了 经过大量谷歌搜索和 Stackoverflowing 后 我仍然不清楚 因为许多文章和问题 答案太笼统了 包括403 Forbidden 与 401 Unauthorized HTTP 响应 https stac
  • R ggplot:图例周围的线

    我正在尝试使用 ggplot2 进行数据绘图 出于纯粹肤浅的原因 我想在图例周围画一条线 以便更好地将其与绘图区分开来 即图例框周围的黑色轮廓 我在任何论坛上都找不到这个问题的答案 但也许你有一个提示 library ggplot2 Res
  • $setIsSubset 用于 Mongo 中的常规查询

    我想做相当于 setIsSubset http docs mongodb org manual reference operator aggregation setIsSubset http docs mongodb org manual
  • 混合模板函数重载和继承

    打印以下代码 generic overload 但我想要的是在这两种情况下都调用重载或专业化 而不是通用的 我并不是想将重载与模板专业化混合在一起 它们在一起是因为没有一个按我的预期工作 有什么模板魔法可以实现这一点吗 include
  • 当我使用 Validator.TryValidateObject 时验证不起作用

    DataAnnotations 不适用于好友类 以下代码始终验证 true 为什么 var isValid Validator TryValidateObject new Customer Context results true 这是好友
  • 添加自定义 DLL 搜索路径@应用程序启动

    我正在绞尽脑汁试图想出一个优雅的解决方案来解决 DLL 加载问题 我有一个应用程序静态链接到加载 DLL 的其他 lib 文件 我没有直接加载 DLL 我希望在可执行文件所在的文件夹之外的另一个文件夹中拥有一些 DLL 例如 working
  • RabbitMQ:快速生产者和慢速消费者

    我有一个应用程序 它使用 RabbitMQ 作为消息队列在两个组件 发送者和接收者 之间发送 接收消息 发送者以非常快的方式发送消息 接收方收到消息后会做一些非常耗时的工作 主要是数据量非常大的数据库写入 由于接收方需要很长时间才能完成任务
  • 方法 JPQL 的查询验证失败

    我正在实现一个查询 该查询返回自定义对象中的输出 通过我的实现 我收到一个错误 方法公共抽象java util List org degs repository ConsolidateresponseRepository transacti
  • 可与类型索引中的和和积合并

    Haskell 中是否有类似于以下类型类的内容 class Mergeable f Type gt Type gt Type where merge f a b gt f c d gt f a c Either b d 特别是 想象有一个S