Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Control.MonadPlus.Free有什么问题?_Haskell_Monads_Free Monad_Monadplus - Fatal编程技术网

Haskell Control.MonadPlus.Free有什么问题?

Haskell Control.MonadPlus.Free有什么问题?,haskell,monads,free-monad,monadplus,Haskell,Monads,Free Monad,Monadplus,定义为 data Free f a = Pure a | Free (f (Free f a)) | Plus [Free f a] 已在free 4.6中删除,并带有以下备注(): 已删除控件.MonadPlus.Free。改用FreeT f[],结果将是守法的 问题是什么,特别是哪些定律不成立?根据bug追踪器中的这一点,旧的定义不符合关联定律 虽然我对这些事情知之甚少,但我怀疑另一个问题是冗余: Pure a Plus [Pure a] Plus [Plus [Pure a]] ...

定义为

data Free f a = Pure a | Free (f (Free f a)) | Plus [Free f a]
已在free 4.6中删除,并带有以下备注():

已删除
控件.MonadPlus.Free
。改用
FreeT f[]
,结果将是守法的

问题是什么,特别是哪些定律不成立?

根据bug追踪器中的这一点,旧的定义不符合关联定律


虽然我对这些事情知之甚少,但我怀疑另一个问题是冗余:

Pure a
Plus [Pure a]
Plus [Plus [Pure a]]
...
所有这些似乎都代表着同一件事。自由结构通常被认为是唯一的。有时它们不能唯一地表示(例如,自由阿贝尔群),但在可能的情况下,它们应该唯一地表示


事实上,我认为建议的替代方案也存在同样的问题,尽管可以使用
非空
而不是
[]
来修复它。因此,这一变化可能只是从库中移除多余的积垢。

我相信表示本身是正确的,并且可以通过改变这些方法签名来纠正合法性

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

i、 e

  • 使用
    幺半群a
    代替
    iter
    中的任意函数
    [a]->a
  • 使用
    MonadPlus m
    代替
    iterM
    中的任意函数
    [ma]>ma

我的猜测是,它被删除了(而不是修复了),只是因为当
FreeT f[]
给出了一个等价的表示时,它不值得保留。

你不应该在帖子中使用“更新”或“编辑”之类的东西。编辑历史记录足以在更改/添加某些内容时查看。我擅自删除了它们(但没有删除内容),并移动了顶部引用bug跟踪器的部分,以便更容易访问。@Bakuriu真的吗?所以,我们不应该立即看到某些东西发生了变化,而是应该深入编辑历史?“正常的方式是不是太简单了?”“正常的方式”,正如你所说的,就是噪音。如果我在寻找答案,为什么我要阅读数百行不相关的“编辑”,最终得到一个两行的答案?答案应该最大化有用性,这意味着可读性和易访问性。将信息分割成不同的块通常不是一个好的解决方案。当问题/答案仍然不清楚/不完整时,这可能没问题,但一旦问题/答案清楚,内容应该组织得很好。如果有人好奇它是如何演变的,他可以查看编辑历史,但那是元数据。@Bakuriu如果我想回答我的问题,第一个回答完全可能不是我需要的。稍后,当我再次访问页面时,我通常会跳过我已经看到的答案——除非有明显的视觉线索表明某些东西已经改变。粗体编辑提供了这样一个线索。不是噪音,而是信息,让我们更容易使用此页面。也许我们应该将此讨论转移到其他地方?
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