问题标签 [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.
scala - 为什么斯卡拉兹 |+| 运算符仅不适用于值为 Seq 的 Maps?
我有两张地图如下。
这编译得很好,一切都按预期工作。
但是这个不能编译(不能解析符号|+|
),我想知道为什么?
更新:我发现这篇很棒的文章回答了为什么会发生编译错误,这基本上,正如评论部分中提到的那样,Seq
它不是一个幺半群:为什么 List a Semigroup 但 Seq 不是?
现在我的问题是:这是否意味着我必须将我的Seq
(IndexedSeq
有同样的问题)转换List
回来Seq
(Seq
实际上是 s ,出于性能原因IndexedSeq
,我应该保留它们)。IndexedSeq
除了编写我自己的地图合并代码之外,还有什么解决方法吗?
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”有关?
任何见解将不胜感激。
haskell - 为什么没有可选的任何实例,而是一个行为类似于替代的半群?
我是 Haskell 新手,我想知道为什么除了Either
半群之外没有替代实例,它的行为与我对替代的预期一样:
此实例丢弃或纠正“错误”,当两个操作数都用 标记时Right
,它采用第一个。这不正是替代方案提供的“选择”吗?
我希望 semigroup 实例大致如下所示:
这意味着它会传播错误并附加常规结果。
我想我Either
对所涉及的类型类有错误的概念。
scala - 使用高级 Scala 功能的 Semigroup 的 Scalaz 实现
我正在挖掘Scalaz中Monoid的实现。我遇到了|+| 如果您在 Monoid 上定义附加操作,则应该开箱即用的运算符。该运算符的定义在SemigroupSyntax中。该类通过Semigroup进入 Monoid 。
在检查了这三个类之后,我有一个主要问题 - SemigroupSyntax的评论究竟是如何实现的/** Wraps a value `self` and provides methods related to `Semigroup` */
在SemigroupSyntax中有一些隐含的魔法,调用.this
trait 等等,我真的不明白。
如果有人能花时间启发我,我会很高兴。
先感谢您!
编辑:
我很想了解这个类的工作原理:
以及它在 Semigroup 中的呼叫站点:
haskell - 浮点数包含在 Sum 和 Product 中,即使它破坏了关联性?
试图学习 Haskell 并偶然发现了这一点:
显然,这是浮点算术的正常误差,但是为什么浮点值Num
的实例或者instance Num a => Semigroup (Sum a)
如果关联性不成立,为什么会有实例?是否有任何其他领域的类型系统的保证不能保证人们应该注意?除了固定宽度的数值?
haskell - 在 append 下保持 IO 惰性
我可能一直认为 Haskell 比它更懒惰,但我想知道是否有一种方法可以两全其美......
Data.Monoid
并Data.Semigroup
定义 的两个变体First
。monoidal 版本对最左边的非空值进行建模,而 semigroup 版本只是对最左边的值进行建模。
这适用于纯值值,但考虑不纯值:
这两个值都有类型Num a => IO a
。IO a
是一个Semigroup
实例,当a
是:
这意味着可以组合两个IO (First a)
值:
但是,正如我们所看到的,两者都会x
产生y
各自的副作用,即使y
从来不需要。
这同样适用于Data.Monoid
:
我想我理解为什么会发生这种情况,因为Semigroup
和Monoid
实例都使用liftA2
,这似乎最终基于IO
bind,据我所知,这是严格的。
但是,如果我放弃First
抽象,我可以获得更懒惰的评估:
使用这两个忽略y
:
在这两种情况下,y
都不会打印。
那么我的问题是:
我可以两全其美吗?有没有一种方法可以保留 Semigroup 或 Monoid 抽象,同时仍然获得惰性 IO?
例如,是否有某种LazyIO
容器可以将First
值包装在其中,以便获得我想要的惰性 IO?
我所追求的实际情况是,我想查询 IO 资源的优先列表以获取数据,并使用第一个给我有用响应的列表。但是,我不想执行冗余查询(出于性能原因)。
haskell - Semigroup Monoid Proposal 的兼容代码
Semigroup
正在成为Monoid
. 我确实阅读了该页面上关于编写兼容代码的建议,但我既不喜欢有条件地依赖semigroups
包,也不喜欢将我的mappend
代码放在顶级声明中。
我现在的尝试是
这个Semigroup
类似乎有一个默认值<> = mappend
,所以我不需要在那里实现任何东西,但我想我也可以把它写出来。
此代码将来会继续工作吗?
它目前在我的设置中有效,但我无法使用所有可能的编译器和基础包进行测试,尤其是未来的。进一步的计划到底是什么,Monoid
我无法掌握。你能发现我的方法有什么问题吗?
haskell - 为什么 Maybe 的 Semigroup 实例偏向 Just 而 Monoid 使用 Nothing 作为其空元素?
Maybe
表示可能由于错误而不会产生结果的计算。因此,这样的计算必须是短路的。
NowMaybe
的 Semigroup/Monoid 实例似乎打破了这种语义,因为前者偏向于Just
,而后者将错误情况Nothing
视为其空元素:
我希望Nothing
前两种情况。
这是替代实现(希望它是正确/合法的):
我不想说这些替代实例更好。但它们似乎也很有用。那么为什么首先做出选择而不是将实现留给用户呢?
scala - 在 Scala 中具有函数的半群
我正在尝试将 Haskell 转换Semigroup
为 Scala。Haskell 代码运行良好,但我无法用 Scala 编写
哈斯克尔:
斯卡拉代码
haskell - 如何在参数化类型上编写“Semigroup”实例及其“quickCheck”?
在关于 Semigroup 的 First Principle book 的 Haskell Programming 练习中,我被要求quickCheck
为用户定义的类型类编写代码。有很多类型类,但我什至不明白如何编写基本类:
问题:
第一个是Trivial
:
第二个是为了
第三个是:
我的回答:
首先,我将instance
表达式更改为
它有效。
我尝试了以下代码,但不适用于第二个:
我发现我不明白quickTest
应该在这里检查什么。我什至尝试过:
使参数化类型的参数具体化。但它也不起作用。
第三,我不知道怎么写。但我认为它与第二个相似。
有人可以解释这些,以便我可以理解如何编写instance
参数化半群及其quickTest
任意性吗?