问题标签 [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 投票
0 回答
573 浏览

scala - 为什么斯卡拉兹 |+| 运算符仅不适用于值为 Seq 的 Maps?

我有两张地图如下。

这编译得很好,一切都按预期工作。

但是这个不能编译(不能解析符号|+|),我想知道为什么?

更新:我发现这篇很棒的文章回答了为什么会发生编译错误,这基本上,正如评论部分中提到的那样,Seq它不是一个幺半群:为什么 List a Semigroup 但 Seq 不是?

现在我的问题是:这是否意味着我必须将我的SeqIndexedSeq有同样的问题)转换List回来SeqSeq实际上是 s ,出于性能原因IndexedSeq,我应该保留它们)。IndexedSeq除了编写我自己的地图合并代码之外,还有什么解决方法吗?

0 投票
1 回答
365 浏览

haskell - Semigroupoid 和 Semigroup 类之间的关系

在上周,我一直在尝试掌握 Haskell 的一些“核心”类型和类型类(但总共学习 Haskell 最多两周),我发现了一些让我烦恼的东西:

  • “Semigroupoid”是“Category”的概括,这意味着任何类别都是平凡的 Semigroupoid,只需忽略它自己的身份并定义

o = (.)

  • 同样,“半群”是“Monoid”的概括,其含义与上述完全相同:只需忽略 mempty 并定义

(<>) = mappend

仅这两个事实,以及 Semigroupoids 和 Semigroups 都只有组合元素的概念(semigroupoid-composition vs semigroup-multiplication)并且 Category 和 Monoid 都具有“统一”(identity vs unit element)的概念带来了请注意,可以将 Semigroupoids 和 Semigroups 以及 Categories 和 Monoids 之间的关系表达如下

现在,我不确定为什么它不能编译;ghc 编译器说:

但碰巧包括

{-# LANGUAGE FlexibleInstances #-}

在文件的顶部修复了所有问题。

上面表达的关系似乎没有在库中构建,而 Semigroupoid 和 Category 之间以及 Semigroup 和 Monoid 之间的关系是内置的。

有什么具体原因吗,我只是想念它吗?

也许它与神秘的“FlexibleInstances”有关?

任何见解将不胜感激。

0 投票
2 回答
2792 浏览

haskell - 为什么没有可选的任何实例,而是一个行为类似于替代的半群?

我是 Haskell 新手,我想知道为什么除了Either半群之外没有替代实例,它的行为与我对替代的预期一样:

此实例丢弃或纠正“错误”,当两个操作数都用 标记时Right,它采用第一个。这不正是替代方案提供的“选择”吗?

我希望 semigroup 实例大致如下所示:

这意味着它会传播错误并附加常规结果。

我想我Either对所涉及的类型类有错误的概念。

0 投票
1 回答
137 浏览

scala - 使用高级 Scala 功能的 Semigroup 的 Scalaz 实现

我正在挖掘Scalaz中Monoid的实现。我遇到了|+| 如果您在 Monoid 上定义附加操作,则应该开箱即用的运算符。该运算符的定义在SemigroupSyntax中。该类通过Semigroup进入 Monoid 。

在检查了这三个类之后,我有一个主要问题 - SemigroupSyntax的评论究竟是如何实现的/** Wraps a value `self` and provides methods related to `Semigroup` */

在SemigroupSyntax中有一些隐含的魔法,调用.thistrait 等等,我真的不明白。

如果有人能花时间启发我,我会很高兴。

先感谢您!

编辑:

我很想了解这个类的工作原理:

以及它在 Semigroup 中的呼叫站点:

0 投票
0 回答
93 浏览

haskell - 浮点数包含在 Sum 和 Product 中,即使它破坏了关联性?

试图学习 Haskell 并偶然发现了这一点:

显然,这是浮点算术的正常误差,但是为什么浮点值Num的实例或者instance Num a => Semigroup (Sum a)如果关联性不成立,为什么会有实例?是否有任何其他领域的类型系统的保证不能保证人们应该注意?除了固定宽度的数值?

0 投票
2 回答
285 浏览

haskell - 在 append 下保持 IO 惰性

我可能一直认为 Haskell 比它更懒惰,但我想知道是否有一种方法可以两全其美......

Data.MonoidData.Semigroup定义 的两个变体First。monoidal 版本对最左边的非空值进行建模,而 semigroup 版本只是对最左边的值进行建模。

这适用于纯值值,但考虑不纯值:

这两个值都有类型Num a => IO aIO a是一个Semigroup实例,当a是:

这意味着可以组合两个IO (First a)值:

但是,正如我们所看到的,两者都会x产生y各自的副作用,即使y从来不需要。

这同样适用于Data.Monoid

我想我理解为什么会发生这种情况,因为SemigroupMonoid实例都使用liftA2,这似乎最终基于IO bind,据我所知,这是严格的。

但是,如果我放弃First抽象,我可以获得更懒惰的评估:

使用这两个忽略y

在这两种情况下,y都不会打印。

那么我的问题是:

我可以两全其美吗?有没有一种方法可以保留 Semigroup 或 Monoid 抽象,同时仍然获得惰性 IO?

例如,是否有某种LazyIO容器可以将First值包装在其中,以便获得我想要的惰性 IO?

我所追求的实际情况是,我想查询 IO 资源的优先列表以获取数据,并使用第一个给我有用响应的列表。但是,我不想执行冗余查询(出于性能原因)。

0 投票
0 回答
190 浏览

haskell - Semigroup Monoid Proposal 的兼容代码

Semigroup正在成为Monoid. 我确实阅读了该页面上关于编写兼容代码的建议,但我既不喜欢有条件地依赖semigroups包,也不喜欢将我的mappend代码放在顶级声明中。

我现在的尝试是

这个Semigroup类似乎有一个默认值<> = mappend,所以我不需要在那里实现任何东西,但我想我也可以把它写出来。

此代码将来会继续工作吗?

它目前在我的设置中有效,但我无法使用所有可能的编译器和基础包进行测试,尤其是未来的。进一步的计划到底是什么,Monoid我无法掌握。你能发现我的方法有什么问题吗?

0 投票
2 回答
756 浏览

haskell - 为什么 Maybe 的 Semigroup 实例偏向 Just 而 Monoid 使用 Nothing 作为其空元素?

Maybe表示可能由于错误而不会产生结果的计算。因此,这样的计算必须是短路的。

NowMaybe的 Semigroup/Monoid 实例似乎打破了这种语义,因为前者偏向于Just,而后者将错误情况Nothing视为其空元素:

我希望Nothing前两种情况。

这是替代实现(希望它是正确/合法的):

我不想说这些替代实例更好。但它们似乎也很有用。那么为什么首先做出选择而不是将实现留给用户呢?

0 投票
2 回答
386 浏览

scala - 在 Scala 中具有函数的半群

我正在尝试将 Haskell 转换Semigroup为 Scala。Haskell 代码运行良好,但我无法用 Scala 编写

哈斯克尔:

斯卡拉代码

0 投票
1 回答
128 浏览

haskell - 如何在参数化类型上编写“Semigroup”实例及其“quickCheck”?

在关于 Semigroup 的 First Principle book 的 Haskell Programming 练习中,我被要求quickCheck为用户定义的类型类编写代码。有很多类型类,但我什至不明白如何编写基本类:

问题:

第一个是Trivial

第二个是为了

第三个是:

我的回答:

首先,我将instance表达式更改为

它有效。

我尝试了以下代码,但不适用于第二个:

我发现我不明白quickTest应该在这里检查什么。我什至尝试过:

使参数化类型的参数具体化。但它也不起作用。

第三,我不知道怎么写。但我认为它与第二个相似。

有人可以解释这些,以便我可以理解如何编写instance参数化半群及其quickTest任意性吗?