Control.MonadPlus.Free出了什么问题?

时间:2015-08-24 14:55:22

标签: haskell monads free-monad

free MonadPlus定义为

data Free f a = Pure a | Free (f (Free f a)) | Plus [Free f a]

已在免费 4.6中删除,并带有以下注释(changelog):

  

已移除Control.MonadPlus.Free。请改用FreeT f [],结果将是守法的。

问题是什么,特别是哪些法律没有?

2 个答案:

答案 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 []给出等效表示时不值得保留。