如何轻松地使用可能的幺半群并将值与自定义操作组合起来?

2023-12-20

基本上,我想做的手动定义是微不足道的

maybeCombine :: (a->a->a) -> Maybe a -> Maybe a -> Maybe a
maybeCombine _ Nothing Nothing = Nothing
maybeCombine _ (Just a) Nothing = Just a
maybeCombine _ Nothing (Just a) = Just a
maybeCombine f (Just a) (Just a') = Just $ f a a'

这没什么大不了的需要时在本地定义 https://github.com/leftaroundabout/timed-media/blob/master/Media/Timed/MiscUtil/Data.hs,但仍然很麻烦,而且如此基本和通用,似乎应该有一个标准实现,但我似乎找不到一个。

也许我只是忽略了一些事情。我想要的似乎与可能的 monad 的行为完全无关,所以我认为我不会在 Monad/Arrow 抽屉中找到任何东西;但它确实类似于Monoid实例

Prelude Data.Monoid> 只是“a” 什么都没有
就一个“一”
Prelude Data.Monoid> 只是“a” 只是“b”
就“ab”
...

...但是这需要a本身就是一个幺半群,即它基本上具有a->a->a“内置”。这MonadPlus实例的行为也很像我想要的,但它只是丢弃其中一个值而不是允许我提供组合函数

Prelude Data.Monoid Control.Monad> 只是 4 `mplus` 没有
就4个
Prelude Data.Monoid Control.Monad> 没有 `mplus` 只是 4
就4个
Prelude Data.Monoid Control.Monad> 只需 4 `mplus` 仅 5
就4个

规范的解决方案是什么?本地模式匹配?带有组合器的东西,例如Data.Maybe?定义一个自定义幺半群来进行组合?


您可以随时使用

f <$> m <*> n <|> m <|> n

但遗憾的是,这在任何地方都没有规范的实现。

您可以使用reflection得到那个(a -> a -> a)“烘焙”为Semigroup与使用Option,由semigroups作为改进版本Maybe有“正确”的实例Monoid按照Semigroup。不过,对于这个问题来说,这有点太严厉了。 =)

也许这应该作为组合器添加到Data.Maybe.

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

如何轻松地使用可能的幺半群并将值与自定义操作组合起来? 的相关文章

  • 如何根据列表中的先前值过滤Haskell中的列表元素?

    我正在努力在 Haskell 中创建一个函数 该函数根据列表中前一个元素的条件过滤列表的数字 Example 前一个数字是 2 的倍数 myFunction 1 2 5 6 3 expected output 5 3 我知道如何申请filt
  • 从 createProcess 外部获取的句柄读取

    我正在尝试创建一个进程 并通过我在外部提供的句柄与其进行通信createProcess功能 stdOutH lt openFile logDir gt stdout log ReadWriteMode hSetBuffering stdOu
  • Foldl 是否比其严格的表亲 Foldl' 更好?

    Haskell 有两个列表左折叠函数 foldl 以及 严格 版本 foldl 不严格的问题foldl是它建造了一座重击塔 foldl 0 1 5 gt 0 1 2 3 4 5 gt 15 这会浪费内存 并且如果列表中的项太多 可能会导致堆
  • 在 Haskell/Yampa 和 HOOD 中调试游戏对象的输出

    我一直坚持使用 Haskell Yampa Arrows with HOOD 为我的游戏对象生成调试输出 我的引擎基本上运行一系列游戏对象 这些对象产生输出状态 线 圆 然后进行渲染 data Output Circle Position2
  • XMonad 在不同工作区启动

    我想在 xmonad start 上启动不同工作区中的一些应用程序 这很重要 所以 我写了以下内容startupHook startupApps String startupApps konsole emacs firefox gvim k
  • 移动列表中特定元素的简单函数

    我是 Haskell 的新手 我正在尝试弄清楚如何创建一个函数 shift Eq a gt a gt a gt Int gt a shift x h t z 输入 一个通用列表和一个相同类型的元素 x 前提条件 元素x存在于列表中 Outp
  • 在 Haskell 中提升 State monad 中的值

    我正在 Haskell 中编写一个数独生成器 求解器作为学习练习 My solve函数接受一个UArray但返回一个State Int UArray 这样它也可以返回解决问题时发现的最大难度级别 到目前为止 这是我的功能 仍处于实验性的早期
  • 使用通用元组函数一次进行多次折叠

    如何编写一个接受类型函数元组的函数ai gt b gt ai并返回一个函数 该函数接受类型元素的元组ai 类型的一个元素b 并将每个元素组合成一个新的元组ai 那是签名应该是这样的 f a1 gt b gt a1 a2 gt b gt a2
  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M
  • 用parsec解析递归数据

    import Data Attoparsec Text Lazy import Data Text Lazy Internal Text import Data Text Lazy pack data List a Nil Cons a L
  • 在 Haskell 中将字节转换为 Int64s/Floats/Doubles

    我正在尝试解析 Haskell 中的二进制文件格式 Apple 的二进制属性列表格式 该格式所需的内容之一是将字节序列视为 a 无符号 1 2 或 4 字节整数 b 有符号 8 字节整数 c 32 位floats d 64 位doubles
  • 如何在 Yesod 中使用 CSS 框架?

    我想将 Blueprint CSS 框架与 Yesod 一起使用 有没有最佳实践 因为 Yesod 使用 CSS 模板 所以在我看来我不能直接使用 css 文件 我必须将它们重命名为 lucius files 吗 如何将 CSS 添加到 d
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si
  • 如何手动推断表达式的类型

    给定 Haskell 函数 head filter fst 现在的问题是如何手动 手动 找到类型 如果我让 Haskell 告诉我我得到的类型 head filter fst Bool b gt Bool b 但我想了解仅使用所用函数的签名
  • Haskell:无法预期类型“Integer”与实际类型“Int”

    我已经盯着这段代码有一段时间了 但我无法理解该错误消息 divisors Integer gt Integer divisors n t t lt 1 n mod n t 0 length a gt Integer length 0 len
  • Haskell 中的 print 是纯函数吗?

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

    嗨 我一直在寻找答案 但找不到 假设我们有一个像这样的列表 1 10 4 5 3 我怎样才能将 5 向左移动 使这个列表变成 1 10 5 4 3 我尝试过了swapElementsAt通过找到该元素的索引 但它看起来非常不足 swapEl
  • “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 其内容如下

随机推荐

  • 如何对齐布局QHBoxLayout和QVBoxLayout?

    我想为我的窗口做这样的布局 所以我尝试创建一个QHBoxLayout布局放置 3 个按钮 并将其添加到QVBoxLayout usr bin python coding utf 8 import sys from PyQt4 import
  • goto 交叉初始化[重复]

    这个问题在这里已经有答案了 假设我有一些 C 代码 if error goto exit size t i 0 error size t i i 0 exit 我明白我们不应该使用goto 但仍然为什么 size t i i 0 编译而si
  • 使用 install4j 对 Linux 可执行文件进行代码签名

    我正在使用 Install4j 和 pfx 文件来为 Windows 安装程序 exe 提供数字签名 但我找不到任何方法为 Linux 安装程序 sh 提供数字签名 有什么方法可以使用 Install4j for linux 可执行文件来做
  • 如何使用javascript重置div中的滚动位置

    我正在开发移动混合应用程序 在我的 html 页面中 我有 3 个选项卡 单击选项卡时 可滚动 div 的内容会发生更改 我的问题是 当我向下滚动 div 视图 的内容并单击另一个选项卡时 内容消失 但内容在那里 请帮助我 以便我可以在单击
  • #!链接中的主题标签和感叹号作为文件夹?

    我怎样才能让我的页面像groveshark页面一样显示 http grooveshark com popular http grooveshark com popular有教程或其他东西知道如何通过 jQuery 或 JavaScript
  • 使 JList 值不可选择 [重复]

    这个问题在这里已经有答案了 我想知道如何修改JList这样单击任何值都不会执行任何操作 我看过其他问题 但没有一个有帮助 我通过使用以下类解决了这个问题 class DisabledItemSelectionModel extends De
  • Clojure 中的 = 和 ==

    在 REPL 上 如果我定义 def fits map vector take 10 iterate inc 0 然后打电话 2 nth fits 2 我变得虚假了 But 2 nth fits 2 返回真 这是预期的吗 我尝试了 clas
  • Android 蓝牙 java.io.IOException:连接被拒绝?

    我需要连接一个KwikBlue 2 模块开发套件 http www socketmobile com products embedded wireless communications kwikblue4 module 到安卓蓝牙聊天示例
  • 尝试向 Firestore 验证 Java 客户端时出现“凭据无法获取元数据”错误

    我把我的东西放在一起thought是你好世界火库Java 客户端身份验证 但它总是死掉 警告 您的应用程序已使用 Google Cloud SDK 中的最终用户凭据进行身份验证 我们建议大多数服务器应用程序使用服务帐户 如果您的应用程序继续
  • 插入 VARCHAR2 列时换行

    我有一个要求 我需要准备电子邮件数据 所以我填充将数据放入以 VARCHAR2 4000 作为定义的表列中 现在我想要的是 将其插入新行中任何我想要的位置 begin v email v email new line end 假设我正在一行
  • 使用jQuery控制视频标签

    因此 我想使用 jQuery 函数从链接的 REL 收集 URL 并将其传递给元素 收集 REL 并将其发送到 没有问题 但是从 jQuery 触发元素的加载和播放功能需要什么 这是我到目前为止所拥有的 function a compone
  • 如何在不换行的情况下执行“float: left”?

    我有一个容器box1具有一定的宽度 可能会根据其内容而变化 那个盒子里有box2它有固定的宽度 它可以是一个图标 旁边box2 我有box3带有一些文字 我希望文本使用右侧的所有可用空间box2 通过粘贴下面的 HTML 您将得到 到目前为
  • 替换先前 bash 命令中所有字符串的快捷方式

    man bash描述了一个非常有用的事件指示符 https www gnu org software bash manual bashref html Event Designators 字符串1 字符串2 快速替换 重复最后一个命令 将
  • 使用 HttpWebRequest 使用 multipart/form-data 发布数据/上传图像

    我正在尝试使用 ImageShack API 上传图像 要使用它 我应该POST图像使用multipart form data 我这样做就像 var postData var req HttpWebRequest Create http w
  • 错误:无法分配给引用或变量!角度 4 [重复]

    这个问题在这里已经有答案了 添加一些新的 html 代码后 我在 Angular 4 中遇到错误 之前表单工作正常 我尝试评论新代码 但它仍然不起作用 该怎么办 我研究了这个错误并尝试解决 但没有任何帮助 我也没有得到问题的确切位置 我的代
  • 在django中提交表单后重定向到索引页面

    除了添加产品数据后重定向回索引页面之外 一切正常 目前在我的数据保存后 它被重定向到127 0 0 1 8000 产品 add product add product 目前 当我的索引页面 add product html 加载时 我有一个
  • 后增量后 == 令人费解的行为[重复]

    这个问题在这里已经有答案了 有人在某个论坛帖子中假设 许多人甚至经验丰富的 Java 开发人员都无法理解下面的 Java 代码 Integer i1 127 Integer i2 127 System out println i1 i2 S
  • 在标准任务之前/之后自动运行自定义任务

    我经常想在运行其中一项标准任务之前进行一些自定义 我意识到我可以创建新任务 按照我想要的顺序执行现有任务 但我发现这很麻烦 而且开发人员错过他应该运行 my compile 而不是编译的机会很大 并导致难以修复错误 所以我想定义一个自定义任
  • EntityFramework Core 2.0 跳过加载专栏

    我使用 EF core 将一些文件保存到 MSSQL 数据库中 其结构如下 public class UploadedFile public int Id get set public string Source get set publi
  • 如何轻松地使用可能的幺半群并将值与自定义操作组合起来?

    基本上 我想做的手动定义是微不足道的 maybeCombine a gt a gt a gt Maybe a gt Maybe a gt Maybe a maybeCombine Nothing Nothing Nothing maybeC