小编lmm*_*lmm的帖子

Scalaz迭代:"提升"`EnumeratorT`以匹配`IterateeT`为"更大"的monad

如果我有一个EnumeratorT和一个相应的IterateeT我可以一起运行它们:

val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length

(it &= en).run : Task[Int]
Run Code Online (Sandbox Code Playgroud)

如果枚举器monad比iteratee monad"更大",我可以使用up或者更一般Hoist地"提升"iteratee以匹配:

val en: EnumeratorT[String, Task] = ...
val it: IterateeT[String, Id, Int] = ...

val liftedIt = IterateeT.IterateeTMonadTrans[String].hoist(
  implicitly[Task |>=| Id]).apply(it)
(liftedIt &= en).run: Task[Int]
Run Code Online (Sandbox Code Playgroud)

但是,当iteratee monad比枚举器monad"更大"时,我该怎么办?

val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...

it &= ???
Run Code Online (Sandbox Code Playgroud)

似乎没有任何Hoist实例EnumeratorT,也没有任何明显的"提升"方法.

monads scala enumerator scalaz iterate

445
推荐指数
1
解决办法
1万
查看次数

层和可扩展效果之间有什么区别?

扩展效果库和库似乎有相同的目标(因此很容易组合不同的效果一起).他们都谈到了他们提供的优于mtl的优势,但都没有提到另一个.两者都可以完成同样的事情吗?一个人包含另一个吗?每个都有一些其他缺乏的功能吗?

monads haskell

16
推荐指数
1
解决办法
735
查看次数

递归方案概括了`tails`

我有一个递归方案样式结构,我想获得所有子结构的列表,包括完整的结构 - 即相当于tails函数在a上的作用List.我认为可以通过调用para,在每一步映射回原始结构,然后将原始结构分别保留在前面来实现这一点,但这看起来非常麻烦:(未经测试,如果Haskell不正确,请写道歉;写的来讲Mu,因为我还没有真正理解Base结构尚)

gtails :: Functor f => Mu f -> [Mu f]
gtails = para (\a -> (fmap fst a) : (foldMap snd a))
Run Code Online (Sandbox Code Playgroud)

(即在这种情况下,对于其他情况,f=Prim这是一个概括)tailsf

有更好的方法吗?我意识到这并不是那么糟糕,但是fmap fst a在那一步恢复"原始"结构感觉相当麻烦,并且foldMap snd a我发现自己在使用时会重复很多para(同样fold a在使用时cata再次感觉它应该是不必要的) .

recursion haskell functional-programming

7
推荐指数
1
解决办法
159
查看次数