我的半身像应该左偏还是偏右?

时间:2018-09-17 10:10:55

标签: haskell

[a]的monoid实例是左偏的。一种方法 通过以下两个演示我的目标 定义:

good ∷ Applicative f ⇒ Semigroup (f ()) ⇒ f ()
good = pure () <> good

bad ∷ Applicative f ⇒ Semigroup (f ()) ⇒ f ()
bad = bad <> pure ()

在这里我们可以看到good @[]有生产力,而bad @[] 发散。相同的问题可能对 性能(运行时和内存使用率)。所以我的问题是 关于是否应该设计自己的通用指导原则 半组是左偏还是右偏?我认为类似 编写/使用时应考虑的事情 Foldable个。也许这就是foldlfoldr是实例方法吗?

2 个答案:

答案 0 :(得分:9)

(这是基于观点的,但我还是会回答)

在其他条件相同的情况下,我将其偏左。

我建议这样做的原因仅在于已经存在左偏心的等分线([a]),而我无法想到任何现有的右偏心的。 (好吧,snoc列表,但是它们很少见。)

此外,从左到右是“效果”(如非终止)或施加剂/单子的常见顺序。我认为大多数程序员已经习惯了这种效果排序的顺序。

答案 1 :(得分:5)

左偏是有意义的,因为这是<>运算符自然关联的方式,没有括号:

good = pure () <> pure () <> pure () <> ...
bad = ((... <> pure ()) <> pure()) <> pure ()

这当然有点像鸡和鸡蛋,因为选择了这种关联性,所以列表可以正常执行。但是我们到了。