[a]
的monoid实例是左偏的。一种方法
通过以下两个演示我的目标
定义:
good ∷ Applicative f ⇒ Semigroup (f ()) ⇒ f ()
good = pure () <> good
bad ∷ Applicative f ⇒ Semigroup (f ()) ⇒ f ()
bad = bad <> pure ()
在这里我们可以看到good @[]
有生产力,而bad @[]
发散。相同的问题可能对
性能(运行时和内存使用率)。所以我的问题是
关于是否应该设计自己的通用指导原则
半组是左偏还是右偏?我认为类似
编写/使用时应考虑的事情
Foldable
个。也许这就是foldl
和
foldr
是实例方法吗?
答案 0 :(得分:9)
(这是基于观点的,但我还是会回答)
在其他条件相同的情况下,我将其偏左。
我建议这样做的原因仅在于已经存在左偏心的等分线([a]
),而我无法想到任何现有的右偏心的。 (好吧,snoc列表,但是它们很少见。)
此外,从左到右是“效果”(如非终止)或施加剂/单子的常见顺序。我认为大多数程序员已经习惯了这种效果排序的顺序。
答案 1 :(得分:5)
左偏是有意义的,因为这是<>
运算符自然关联的方式,没有括号:
good = pure () <> pure () <> pure () <> ...
bad = ((... <> pure ()) <> pure()) <> pure ()
这当然有点像鸡和鸡蛋,因为选择了这种关联性,所以列表可以正常执行。但是我们到了。