comonadCofree
对于以错误类型的多态方式迭代部分函数很有用。它coiter
类似于forM
错误单子中的循环,但它以纯/惰性方式收集生成的值,并且您只会在数据结构的末尾看到错误。
例如,Cofree Identity
(no failure allowed!) 是一个无限流,而与 ,Cofree Maybe
同构NonEmpty
,并且Cofree (Either e) a
基本上是(NonEmpty a, e)
(成功迭代值的列表加上最后发生的错误)。
现在我想知道评估结果的最佳方法是什么,而不需要对单个错误单子进行特定的模式匹配。由于实例(例如),提取所有值非常容易,但我不确定如何最好地掌握错误。可以利用它来摆脱这些值并留下错误部分:Foldable
toList
Foldable
vals'n'err :: (Monad m, Foldable m)
=> Cofree m a -> (NonEmpty a, (m ()))
vals'n'err (a :< q) = case toList q of
[] -> (a:|[], const () <$> q)
l -> first (pure a<>)
$ foldr1 (\(bs,e) (cs,f) -> (bs<>cs, e>>f)) $ vals'n'err<$>l
但这感觉有点骇人听闻。有更好的解决方案吗?