如何“平行”组合镜头

2023-11-26

我是优秀的新手Control.Lens我正在尝试将两个镜头“并行”(而不是按顺序)组合起来,就像我对“Control.Arrow.&&&”所做的那样。

如果我以lens文档:

`data Foo a = Foo { _baz :: Int, _bar :: Int, a }

我希望能够做这样的事情:

>> let foo = (bar &&& baz) .~ (1, 20) $ Foo undefined undefined "FOO"
>> foo ^. (bar &&& baz) 
(1, 20)

我到处都找过了,但找不到办法。那是因为:

  • (&&&) 有另一个名字,但我错过了。
  • 没用的。我不需要它,因此没有人费心实施它。
  • 用另一种方式来做很简单(使用both or <*>)

Update

&&&可以这样实现:

(/|\) :: Lens' f a -> Lens' f b -> Lens' f (a, b)
a /|\ b = lens getBoth setBoth where
    getBoth f = (f ^. a, f ^. b)
    setBoth f (v, w) = a .~ v $ f' where
        f' = b .~ w $ f

barz :: Lens' Foo (Int, Int)
barz = bar /|\ baz

然而,它需要一个有点烦人的类型签名。


这个组合器可能无法实现。考虑:

> (baz &&& baz) .~ (1,5)

这个应该怎么办呢?

组合器的甚至更弱:

(/|\) :: Lens' s a -> Lens' s a -> Traversal' s a
a /|\ b = (a &&& b) . both

会违反法律:

例如,让我们看看baz /|\ baz。自从一个Traversal也是一个Setter,它还必须满足Setter laws。现在,采用第二设置法:

over (baz /|\ baz) (f . g) = over (baz /|\ baz) f . over (baz /|\ baz) g

现在,我们得到:

over (baz /|\ baz) (f . g) 
= \(Foo _baz _bar) -> Foo (f . g . f . g $ _baz) _bar

and:

over (baz /|\ baz) f . over (baz /|\ baz) g
= \(Foo _baz _bar) -> Foo (f . f . g . g $ _baz) _bar

这两者显然是不同的。当两个镜头“重叠”时就会出现问题,并且这不会在类型中进行编码。

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

如何“平行”组合镜头 的相关文章

  • Haskell 中的参数数量和无点 [重复]

    这个问题在这里已经有答案了 对于多重模式匹配 不同数量的参数是不可能的 即使是无点的 foo True b b 2 foo id 例如 不起作用 但 foo True 2 foo id 做 有时我们只能在函数的一部分使用 point fre
  • 如何在递归方案中派生实例

    我正在测试其中的一些想法本文 http blog sumtypeofway com an introduction to recursion schemes 我想派生 Term 类型的 Eq 实例 LANGUAGE DeriveFuncto
  • 结构上强制的自由替代,没有左派分配性

    有一个不错的免费替代品 http hackage haskell org package free 4 12 4 docs Control Alternative Free html在伟大的free包 它将函子提升到左分配替代方案 也就是说
  • 绑定变量时 Haskell 中的无限循环

    下面的 Haskell 代码不会终止 有人可以解释一下为什么吗 谢谢 f let x 10 in let x x x in x 我认为解释器首先绑定 x 10 然后将 x x 计算为 100 并绑定 x 100 环境变为 x 100 那么整
  • yesod——密码保护临时站点

    我正在尝试设置 yesod 网络服务器的临时实例 我想知道是否有一些简单的方法可以使整个站点受到密码保护 具体来说 我希望能够提示那些导航到我的网站的人提供凭据 经过身份验证后 它应该像典型站点一样运行 但如果他们无法验证自己的身份 他们就
  • 在 Haskell 中对单位的组成(例如英寸、美元等)进行建模

    跟进自我之前的一个问题 https stackoverflow com q 73375273 222529 我问如何创建一个可以对单元进行建模的类型 例如Inch 作为 Haskell 中的一种类型 我现在面临的问题是如何对该单元和其他单元
  • 使用 Haskell 的欧拉项目 #1

    import Data Set euler Int euler sum x x lt nums where nums Data Set toList Data Set union Data Set fromList 3 6 999 Data
  • 如何将可选标志解析为 Maybe 值?

    我正在尝试使用optparse 应用程序 https hackage haskell org package optparse applicative 0 11 0 2解析一个Maybe String但我找不到任何地方如何处理Maybe 我
  • 不同 hs 文件中的函数分离时堆栈空间溢出

    我有一个巨大的 haskell 文件 它编译和运行没有任何问题 我想将一些函数和类型定义放在通用 hs 文件中的单独模块中 然后将其导入我的主模块中 虽然主程序编译时没有任何错误 它还编译导入的模块 但当我尝试运行它时 出现堆栈空间溢出 I
  • 如何向 Scotty 中间件添加基本身份验证?

    我目前正在制作 Scotty API 但找不到任何 basicAuth 实现的示例 Wai Middleware HttpAuth 具体来说 我想将基本身份验证标头 用户 通行证 添加到我的某些端点 即以 admin 开头的端点 我已经设置
  • 如何在 Haskell 中枚举递归数据类型?

    这篇博文 http lukepalmer wordpress com 2008 05 02 enumerating a context free language 对于如何使用 Omega monad 对角枚举任意语法有一个有趣的解释 他提
  • 如何、为什么以及何时使用“.Internal”模块模式?

    我在上面看到了几个包裹hackage http hackage haskell org packages archive pkg list html其中包含模块名称 Internal作为他们的姓氏组成部分 例如Data ByteString
  • 谁能解释一下 GHC 对 IO 的定义吗?

    标题非常自我描述 但有一个部分引起了我的注意 newtype IO a IO State RealWorld gt State RealWorld a 剥离newtype 我们得到 State RealWorld gt State Real
  • “反向”使用 Maybe Monad

    假设我有很多功能 f a gt Maybe a g a gt Maybe a h a gt Maybe a 我想按以下方式组合它们 如果 f 返回 Nothing 则计算 g 如果 g 返回 Nothing 则计算 h 如果其中任何一个计算
  • 为什么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 但是
  • 将 Either 列表转换为其中包含列表的 Either 列表

    我是 Haskell 的初学者 我正在编写一些使用 Haskell 的代码Either https hackage haskell org package base 4 9 0 0 docs Data Either html用于错误处理 E
  • 我应该使用镜头中的什么来按索引构建只读吸气剂?

    我有一个内部细节被隐藏的类型 我想提供某种镜头 可以在特定索引处读取所述类型的元素 但是not修改它们 一个Ixed我的类型的实例似乎没有做我想要的事情 因为它明确允许修改 尽管不允许插入或删除 如果我想允许只读索引 我不确定我使用什么 如
  • 如何处理“恐慌:不可能的事情发生了”并在 Haskell 中继续

    我有以下代码 它使用 GHC API 加载模块并获取表达式的类型 typeObjects String gt String gt IO Type typeObjects modules objects do defaultErrorHand
  • 使用 Haskell 将函数注入到 Java .class 文件中

    我使用 Haskell 编写了一个 Java 字节码解析器 它工作得很好 然而下一步让我完全难住了 我的 Haskell 程序需要修改 class 文件 以便在执行时 Java 程序打印 输入 此处的方法名称 在执行方法之前 并且 退出 此
  • 为什么 Haskell 中的点是从右向左排列的?

    如果我们有两个函数 f and g 然后在哈斯克尔h f g相当于h x f g x IE 这些函数从右到左应用于输入 有什么根本原因可以解释为什么它是从右到左 而不是从左到右吗 IE 他们为什么不做h f g相当于h x g f x 反而

随机推荐

  • 将字符串的第一个字母大写,而不接触其他字母

    我想将字符串的第一个字母大写 但保留其余字母 我拥有的 赛车 我想要的是 赛车 然后只需将第一个字母大写str upper 并连接其余部分不变 string 0 upper string 1 Demo gt gt gt string rac
  • 测试 SQL 连接字符串可用性的最有效方法

    我有这段代码 我试图让它测试 SQL 字符串连接 但我不知道如何处理该部分connection Open true你能帮我解决这个问题吗 非常感谢您的参与 private void button1 Click object sender E
  • 使用 tcltk 在 R 脚本中添加弹出文本框

    我有一个很长的脚本来进行一些数据分析 它必须连接到多个数据库 其中一个数据库更新密码的频率往往比我想要的要高 因此我想添加一个弹出框供我输入当前密码 我找到了这个示例 但不了解足够的 tcltk 来查看当对话框关闭时 hwo 返回我的值 我
  • Rust 中的英文字母作为字符向量

    标题说明了一切 我想将字母表生成为字符向量 我确实考虑过简单地创建 97 122 的范围并将其转换为字符 但我希望有一种更好看的方式 例如 Python 的string ascii lower 生成的向量或字符串应包含字符 a z 对这类事
  • 如何使用knitr从r脚本函数生成多个文件

    我想从 r 脚本生成一些报告 我想避免从 rmd 文件编译时所需的重复 并且如果可能的话 我想从 r 脚本本身生成报告 该脚本具有一个函数 该函数应该从一系列数据帧生成每个报告 其中每个报告代表一个数据帧的处理 我只是不明白如何单独生成每个
  • JAVA中实例化的具体含义是什么

    我是一个JAVA新手 这次遇到了这个词叫做 在java中 在方法内部创建的类称为局部内部类 如果要调用局部内部类的方法 则必须实例化这个类在方法中 该词以粗体显示 谁能帮我解决这个问题 我知道这很尴尬 我应该进行更多研究 但我就是无法理解
  • 禁止从 Python 函数打印 stdout / stderr

    我有一个 Python 脚本 它使用我的雇主提供的一些封闭式 Python 函数 即我无法编辑这些函数 当我调用这些函数时 它们会将输出打印到我想禁止的 Linux 终端 我尝试通过重定向 stdout stderr orig out sy
  • 错误:找不到 npm 模块“时刻”

    我有一个 Meteor 应用程序 可以在本地主机上完美运行 但是当我将其部署到远程时heroku服务器 我收到以下错误 我正在实施this 请问有什么办法解决这个问题吗 2016 09 09T13 26 02 533532 00 00 he
  • 创建静态和共享 C++ 库

    我想建立静态库和共享库在一个项目中 我知道需要从使用 fpic 编译的对象创建共享库以获得位置无关代码 而静态库不需要这个 这一切都很好 我可以创建共享库或静态库 我不想编译我的源代码两次以获得不同的目标文件 那么这通常是如何完成的 我读如
  • Linux,第一次读取或第一次写入时会清零页面页错误吗?

    我的问题是 Linux 特定的 需要了解内核 虚拟内存 mmap 页面错误 我有一个带有大型静态数组的 C 程序 它将进入 bss 部分 内存 初始化为零 当程序启动时 这块内存并没有物理分配 只有虚拟内存 虚拟内存的每一页都映射到特殊的零
  • iOS 将文件从主包复制到文档目录

    我正在尝试将添加到名为 includes 的文件夹中的文件复制到文档目录上也称为 includes 的文件夹中 我得到的值为零resContents Why void copyResources NSString sourcePath NS
  • 流式传输实时音频

    我想在 Android 设备上具有实时音频流的功能 它通过设备的 MIC 捕获音频并将其发送到服务器 我知道在录制后发送音频文件 但如果是实时的 我需要帮助 也许可以通过不断向服务器发送字节数组来完成 如果是的话 如何或是否有其他方式 请分
  • TypeError: Type str 不支持 buffer API # find 方法?

    这是我的输入 div class content div class stream item header a class account group js account group js action profile js user p
  • Apple A4 上的 YUV 到 RGBA,我应该使用着色器还是 NEON?

    我正在使用 OpenGL ES 和 ffmpeg 为 Apple TV 编写媒体播放器框架 在 OpenGL ES 上渲染需要转换为 RGBA 使用 swscale 进行软转换速度慢得难以忍受 所以根据网上的信息我想出了两个想法 使用 ne
  • 从 Spark (pyspark) 管道内的 StringIndexer 阶段获取标签

    我在用Spark and pyspark我有一个pipeline设置了一堆StringIndexer对象 我用它来将字符串列编码为索引列 indexers StringIndexer inputCol column outputCol co
  • 在 TypeScript 中,当类型是函数的参数时,是否有办法限制 Partial 类型的额外/多余属性?

    是否有一种标准方法可以让场景 1 因未指定已知属性而出现编译错误 就像场景 2 中一样 或者有一些解决方法吗 class Class2 g number class Testing static testIt3
  • RabbitMQ 的最大消息大小

    发布到 RabbitMQ 队列 发布 订阅模型 时消息的最大大小是多少 我在文档中看不到任何明确的限制 但我认为有一些指导方针 提前致谢 我正在做比较亚马逊队列服务 and RabbitMQ或其他流媒体 消息平台 如 kinesis kaf
  • 为什么 Javascript 内置方法/函数是用 C/C++ 而不是 JS 语法编写的

    这个问题是参考这个老问题在哪里可以找到 javascript native functions source code 该页面上的答案说 源代码位于c or c 但我很好奇为什么来源 定义 是这些语言 我的意思是它们是 JS 函数定义 例如
  • 分离一些次要情节,但不分离其他次要情节; Python、Matplotlib

    我正在 python v 2 7 9 中使用 matplotlib v 1 4 2 绘制子图网格 我可以手动调整子图之间的间距 但我希望仅某些子图具有不同的间距 我希望的最终图形是左侧有一个 2x5 子图网格 右侧有一个 2x5 子图网格
  • 如何“平行”组合镜头

    我是优秀的新手Control Lens我正在尝试将两个镜头 并行 而不是按顺序 组合起来 就像我对 Control Arrow 所做的那样 如果我以lens文档 data Foo a Foo baz Int bar Int a 我希望能够做