问题标签 [monoids]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
201 浏览

scala - Monoid 类型注解

在 Scala 中的函数式编程一书中,我看到了以下签名:

描述说:

我很难理解以下部分:

A 是 Monoid 类型,它把自己作为类型参数?这怎么理解?

0 投票
3 回答
1784 浏览

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

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

在需要时在本地定义它并不是什么大不了的事,但仍然很麻烦,而且如此基本和通用,似乎应该有一个标准的实现,但我似乎找不到一个。

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

Prelude Data.Monoid> Just "a" <> Nothing
Just "a"
Prelude Data.Monoid> Just "a" <> Just "b"
Just "ab"
...

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

Prelude Data.Monoid Control.Monad> Just 4 `mplus` Nothing
Just 4
Prelude Data.Monoid Control.Monad> Nothing `mplus` Just
4
Prelude Data.Monoid Control.Monad> Just 4 `mplus` Just 5
Just 4

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

0 投票
1 回答
598 浏览

haskell - 没有 Monoid 实例的折叠

我有一个简单的树结构:

和一个可折叠的实现:

即使没有实现,它也可以工作Monoid,我既不能使用也mappend不能mempty在我的代码中使用。那么这个Foldable实现是如何工作的呢?

0 投票
1 回答
388 浏览

haskell - 可折叠和树木

我对树有以下定义

以下是可折叠的实例:

这段代码抛出了我和错误

如何在 Tree a 类型的实例声明中使用 t 而不是 a?

0 投票
1 回答
1092 浏览

haskell - 理解 Data.Functor.Constant 构造函数和应用规律

我对 Data.Functor.Constant 的类型构造函数以及它如何与应用程序一起使用感到困惑。


首先是构造函数:

当我检查类型Constant :: a -> Constant a b

我看到它需要一个a,但返回一个Constant a b

b从何而来,为什么存在?


其次,我在 Applicative 上苦苦挣扎:

我了解 Constant 需要在内部有一个 Monoid 才能成为 Applicative 实例。

它必须遵守的一条法律是:pure id <*> Constant x = x

我认为这与以下内容相同:Constant id <*> Constant x = x

但我想我错了,因为下面的代码清楚地显示了纯粹的不同行为。

我看到它只有x在同一个幺半群的情况下才有效,除非我使用纯。所以我不确定为什么 pure 的工作方式不同。我怀疑这与b他们在同一个问题中的原因有关。

总结一下这两个问题:

  1. 在 Constant 构造函数中做了什么b

  2. 为什么即使幺半群内部不同,pure 也会起作用?

非常感谢!

0 投票
5 回答
727 浏览

scala - Scala中Option的关联二元运算

我记得monad是一个monoid。也就是说,有一个关联二元运算 *,因此如果mamb一元值,那么ma * mb也是一元值。

如果以上是正确的,那么OptionScala 中的二进制操作是什么?例如,什么可以*Some(1) * Some(2)

0 投票
1 回答
751 浏览

sorting - 你能把冒泡排序表述为一个幺半群或半群吗?

给定以下冒泡排序的伪代码

这是冒泡排序作为 Scala 的代码

这是 Haskell 的实现:

是否可以将其表述为幺半群或半群?

0 投票
2 回答
770 浏览

scala - 你能为基数排序制定一个幺半群或半群吗?

这是基数排序的伪代码:

这是基数排序的 Scala 代码:

这是基数排序的 Haskell 代码:

我的问题是:你能为基数排序制定一个幺半群或半群吗?

0 投票
2 回答
388 浏览

sorting - 你能在 Clojure 中将插入排序表述为一个幺半群吗?

这是 Clojure 中插入排序的代码:

这是在 Haskell 中表示为幺半群的插入排序:

这是在 Clojure 中编写幺半群的方法:

我的问题是:你能在 Clojure 中将插入排序表述为一个幺半群吗?

0 投票
5 回答
2504 浏览

haskell - `Data.Monoid` 中所有这些新类型包装器的实用价值是什么?

在查看 时Data.Monoid,我看到有各种newtype包装器,例如AllSumProduct,它们编码各种类型的幺半群。但是,当尝试使用这些包装器时,我不禁想知道使用它们的非Data.Monoid对应物有什么好处。比如比较比较繁琐的求和

与更简洁的惯用变体相比

但有什么意义呢?newtype拥有所有这些包装器有什么实用价值吗?是否有Monoid newtype比上述更令人信服的包装器使用示例?