【发布时间】:2017-06-22 10:35:35
【问题描述】:
为什么guard是基于Alternative?
guard :: Alternative f => Bool -> f ()
-- guard b is pure () if b is True,
-- and empty if b is False.
我问是因为guard 只使用来自Alternative 的empty。它根本不使用来自Alternative 的<|>。那么为什么要首先使用Alternative呢?
我猜这是因为Alternative 的empty 背后有一些未说明的想法,这与我们试图通过guard 完成的目标完全匹配(停止False,继续True) .如果是这种情况,请告诉我这个未说明的想法。
同时,如果觉得我们只是忽略了<|>。感觉就像guard 没有“完全捕捉”Alternative 的全部内容。我希望这是有道理的。更具体地说:他们为什么不发明另一个类型类,称为Stoppable(或Abortable)并使用它而不是Alternative?
【问题讨论】:
-
您还需要
pure。当然,您可以有一个提供pure的Pure类和一个提供empty的Empty类,并且让Alternative两者都需要。但是,出于务实的原因,并不总是将一个类拆分为单一方法的类。 -
这种情况下是实际原因还是历史原因?
-
我认为是因为没有类型,可以实现
empty,不能实现(<|>)。因此,理论上类型类Stoppable将等于Alternative(类型集将相等)。 -
@freestyle: 好笑,PureScript 通过
Plus(提供empty)定义Alternative,它是基于Alt(提供(<|>))。所以他们遵循 Semigroup/Monoid 方法。
标签: haskell alternative-functor