data Free f a = Pure a | Free (f (Free f a)) | Plus [Free f a]
已在免费 4.6中删除,并带有以下注释(changelog):
已移除
Control.MonadPlus.Free
。请改用FreeT f []
,结果将是守法的。
问题是什么,特别是哪些法律没有?
答案 0 :(得分:13)
根据错误跟踪器中的issue,旧定义不遵守关联法则。
虽然我对这些事情知之甚少,但我怀疑另一个问题是冗余:
Pure a
Plus [Pure a]
Plus [Plus [Pure a]]
...
似乎都代表着同样的事情。自由结构通常被认为是独特的。有些时候它们不能被唯一地表示(例如,自由的阿贝尔群体),但是在可能的情况下它们应该是。
实际上,我认为建议的替代方案会遇到同样的问题,尽管可以使用NonEmpty
代替[]
来修复它。因此,这种改变可能只是从图书馆中消除过多的瑕疵。
答案 1 :(得分:1)
我认为表示本身是可以的,并且通过更改这些方法签名可以纠正合法性
iter :: Functor f => (f a -> a) -> ([a] -> a) -> Free f a -> a
iterM :: (Monad m, Functor f) => (f (m a) -> m a) -> ([m a] -> m a) -> Free f a -> m a
到
iter :: (Functor f, Monoid a) => (f a -> a) -> Free f a -> a
iterM :: (MonadPlus m, Functor f) => (f (m a) -> m a) -> Free f a -> m a
即
Monoid a
中使用[a] -> a
代替任意函数iter
; MonadPlus m
中使用[m a] -> m a
代替任意函数iterM
。我的猜测是它被移除(而不是修复)只是因为FreeT f []
给出等效表示时不值得保留。