当前位置: 首页 > 知识库问答 >
问题:

如何使用maybe么半群和组合值与一个自定义操作,轻松?

庞阳波
2023-03-14
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'

也许我只是忽略了什么。我想要的东西似乎与也许单子的行为无关,所以我想我不会在单子/箭的抽屉里找到任何东西;但它肯定与monoid实例相似

前奏数据。Monoide>只有“A”<>没有
只有“A”
前奏数据。Monoide>只有“A”<>只有“B”
只有“AB”
...

...但它要求a本身是一个么半群,即它基本上“内置”了A->A->a。code>MonadPlus实例的行为也与我想要的一样,但它只是丢弃了一个值,而不允许我提供组合函数

前奏数据.Monoid Control.Monad>只有4`mplus`没有
只有4
前奏数据.Monoid Control.Monad>没有`mplus`只有4
只有4
前奏数据.Monoid Control.Monad>只有4`mplus`只有5
只有4

规范的解决方案是什么?局部模式匹配?包含组合符的东西,例如data.maybe?定义一个自定义么半群来进行组合?

共有1个答案

孙经艺
2023-03-14

当您注意到f类似于底层a类型上的monoid操作时,您的理解是正确的。更具体地说,这里的情况是,通过邻接一个零(mempty)、nothing,将一个半群提升为一个么半群

这正是您在maybe么半群的Haddock中看到的。

根据http://en.wikipedia.org/wiki/Monoid:“任何半群S都可以变成一个么半群,只需邻接一个不在S中的元素e,并对所有S∈S定义ee=e和es=S=S*e。”由于不存在只提供映射的“半群”类型类,所以我们用么半群代替。

或者,如果您喜欢semigroups包,那么有一个选项正好具有这种行为,可以适当地推广使用底层的semigroup

因此,最清楚的方法是在基础类型a上定义么半群半群实例。将某个组合器f与该类型相关联是一种简单的方法。

如果您不控制该类型,不想要孤立实例,并且认为newtype包装器很难看,该怎么办?通常情况下,您会很倒霉,但在这里,使用完全黑魔法,有效地只使用GHC的反射包就会派上用场。论文本身有详尽的解释,但Ausin Seipp的FP完整教程包括一些示例代码,允许您将任意半群积“注入”到类型中,而没有(同样多的)类型定义噪声...以更吓人的签名为代价。 

然而,这可能大大超过了它的价值。

 类似资料:
  • 本文向大家介绍使用Spring组合自定义的注释 mscharhag操作,包括了使用Spring组合自定义的注释 mscharhag操作的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将介绍一个非常有用的Spring功能,该功能允许我们基于一个或多个Spring注释创建自己的注释。 假设我们有一组经常一起使用的Spring注释。一个常见的示例是@Service和@Transactional的

  • 问题内容: 我一直在一些存储库中使用自定义操作。到目前为止,我只需要指定url和方法。 例如: 但是随后,我不得不编写一个自定义操作,该操作不包含一个,而是两个路径参数: 所以我首先将其编码为: 但这是行不通的。参数未传递。 经过几次尝试,我发现在自定义操作定义之前添加一些参数定义可以正常工作。 它必须像: 请注意以下情况: 当时我的理解是,在$ resource定义中,具有多个路径参数的自定义操

  • TensorFlow GraphDef based models (typically created via the Python API) may be saved in one of following formats: TensorFlow SavedModel Frozen Model Session Bundle Tensorflow Hub module All of above f

  • 本文向大家介绍Python列表和元组的定义与使用操作示例,包括了Python列表和元组的定义与使用操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python列表和元组的定义与使用操作。分享给大家供大家参考,具体如下: 运行结果: 更多Python相关内容感兴趣的读者可查看本站专题:《Python列表(list)操作技巧总结》、《Python编码操作技巧总结》、《Python数据结

  • 问题内容: 使用$ http,我们可以这样做: 我想用$ resource引用做同样的事情(不起作用): 与这样声明的相应服务: 它不起作用:config对象转到url而不是http标头。 有没有办法做到这一点 ? 问题答案: 对于是因为AngularJS 1.1.1可用。确保您使用了正确的版本。 格式为 [以上内容似乎不正确。$ resource的第三个参数应该不同。这对我来说似乎更正确:

  • 我有Spark 1.5.0的代码。 案例类myCaseClass(user\u id:String,description:String) 这是我的自定义项 这是我生成数据帧的地方 现在,我想对这个有两列(都是字符串)的DF执行redueByKey操作。我的user\u id不是唯一的,我希望包含给定user\u id的所有值/描述条目。 我怎样才能做到这一点? 我可以做这样的事情: 但是我如何在