问题标签 [semigroup]

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 回答
163 浏览

sorting - Data.Semigroup ((<>)) 在这个 Haskell 排序代码中做了什么?

该程序可以按制造商或年份对列表进行排序。什么是(<>)?

0 投票
1 回答
272 浏览

merge - Cats semigroup 将 HashMap 列表合并到一个 Scala 中

我有一个 hashMaps 列表如下:

我想将这些 HashMap 合并到一个 HashMap 中:

我努力了

listHashMaps.flatten.ToHashMap 但它似乎不起作用。我已经读到可以使用来自猫的半群来做到这一点,如下所示,但我似乎可以弄清楚如何迭代 List 以便将 HashMaps 合并为一个。

0 投票
1 回答
105 浏览

haskell - 制作 Semigroup 的参数化数据类型实例

我想让数据类型Moneda成为 Semigroup 的实例,并将关联操作实现为+. 我很难正确理解它。

我找到的工作解决方案如下:

Moneda我不明白为什么下面的方法会失败,以及如何在不创建实例的情况下使其工作Num

0 投票
2 回答
433 浏览

haskell - liftA2 是否保留关联性?

给定一个(??)这样的操作

(也就是说(??)是联想的)

一定是这样吗

(也就是说liftA2 (??)是联想的)

如果我们愿意,我们可以将其重写为:


我花了一点时间盯着适用的法律,但我无法拿出证据证明情况确实如此。所以我开始反驳它。我尝试过的所有开箱即用的应用程序(Maybe[]Either等)都遵循法律,所以我想我会创建自己的。

我最好的想法是制作一个空的应用程序,并附加一条额外的信息。

Alg稍后我会根据自己的方便定义一些代数在哪里,以使财产失败但适用的法律成功。

现在我们这样定义我们的实例:

哪里iAlg要确定的某个元素,并且comb是一个二元组合子Alg也有待确定。我们实际上没有其他方法可以定义这一点。

如果我们想实现同一性法则,这将迫使i同一性结束comb。然后我们免费获得同态交换。但是现在组合力强制comb关联Alg

强迫我们满足财产。

有反例吗?如果不是,我们如何证明这个属性?

0 投票
1 回答
68 浏览

scala - 为什么 Semigroup 有 Option 类型并且表现得像 Monoid 中的中性元素?

为什么 Semigroup 有 Option 类型而 None 表现得像 Monoid 中的中性元素?

0 投票
0 回答
53 浏览

scala - 使用案例类的折叠和空实例从 List[IO(Abstraction[List[A]]]] 移动到 IO[Abstraction[List[A]]]

首先,我有一个案例类定义为(这是库的一部分):

我想将它用作折叠的主要组件,以便从 List[IO[Abstraction[List[A]]]] 转到 IO[Abstraction[List[A]]]。

当我阅读时,我想将其作为 Monoid 的一个实例来定义合并最终结果的行为。

我的提议如下,但我知道它有错误,因为我没有很好地掌握它。

如果有任何其他方法可以实现这一目标,我愿意接受建议

0 投票
3 回答
388 浏览

haskell - Data.Semigroup 中的 ArgMin 和 ArgMax 类型同义词的用途是什么?

Haskell 中的base库在 中具有以下类型同义词Data.Semigroup

以下是黑线鳕的链接:ArgMinArgMax

这两种类型的同义词的目的是什么?它们可以在哪里有效使用?

解释一下 argmin 和 argmax 函数在数学中的作用以及它们与这些类型同义词的关系可能会有所帮助。


这里有一些额外的信息,所以你不必跳到 Hackage。

这是 的定义Arg

它的文档字符串表明,ArgMin并且ArgMax可以放置在其中MinMax计算 arg min 或 arg max。

Min如下Max所示:

这个Semigroup例子很有趣:

看起来它正在使用minas (<>)

我们可以看看Ord实例的样子Arg,因为它在这里是相关的:

这似乎只对第一个类型参数运行比较Arg

0 投票
0 回答
58 浏览

scala - 导出 F[A] 的半群实例

自己实现它似乎微不足道:

但是有可能自动推导出来吗?Kittens似乎可以与case classes 一起使用(至少我在这种情况下尝试过它并没有用)。

0 投票
1 回答
163 浏览

haskell - 在 Haskell 中创建 Semigroup 数据类型实例

可能的目标是为 Haskell 中新定义的数据类型创建一个新的 Semigroup 类型类实例(对于那些知道Will Kurt 的“Get programming with Haskell”一书的人,我可以参考第 428 页,即顶点项目的结尾5 与锻炼扩展)。

有一个新定义的数据类型:

此数据类型指定类似 SQL 的查询,其中m定义上下文(Monad 或 Alternative),(m a -> m b)是目标类似于 SQL 函数的函数SELECT,即定义想要在数据库中看到的属性类型,(m a)是一个“表”,应用前面的函数(类似于 SQL 的table_name),最后(m a -> m a)过滤掉正在寻找的属性(类似于 SQL 的WHERE)。

我的目标是使这个数据类型成为一个半群(最后是一个 Monoid)的实例。值得一提的是,所有需要的 Semigroup 实例a都是b假设的。

所以它的粗略想法(在背景上看得更清楚)是可以将数据库的几个不同查询组合成一个查询,但我想不出如何合并两个不同的功能同时输入(m a -> m b)一个合并两个表(m a)...第一个想法是将它们合并到列表中,但是类型签名发生了变化,我还没有找到解决这个问题的方法。

0 投票
1 回答
57 浏览

typescript - 在 TypeScript 中,如何从接口引用实现类?

我正在通过实现Fantasy Land Spec来探索 Typescript 类型系统,但在尝试实现Semigroup的规范时遇到了问题。

规范规定 aSemigroup应遵守以下类型定义:

我理解这意味着实现的类型a应该Semigroup有一个concat方法,该方法接受一个类型的参数a并返回一个类型的参数a

我能想到在 TypeScript 中表达这种类型定义的唯一方法是:

但是当我尝试在一个类上实现这个接口时,像这样:

我收到一个编译器错误,告诉我:

感谢这个S/O 答案,我想我理解了这个问题。

我认为编译器本质上是在告诉我:你的接口说你应该接受一个具体类型的参数this(在这种特殊情况下),但也可以传入Sum一个扩展类。Sum

但是,我不知道如何解决它。也就是说,我不知道如何Semigroup在 TypeScript 中表达类型定义。如何从接口引用实现类?

这是TS Playground的链接。

更新

@Guerric P 的回答让我想到了部分解决方案。Guerric 的解决方案是在接口上使用泛型。此解决方案使实现规范成为Semigroup可能,如此处所示但接口并没有真正执行它。

幻想大陆进一步描述规范如下:

b认为我们至少可以将类型限制为Semigroup. 这样,它会强制执行b必须Semigroup为如下所示类型的约束:

但它仍然没有强制它必须是 SAME Semigroup。我仍在寻找一种使用 TypeScript 类型系统的方法。