首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何组合返回写入器[List[Int],Int]的函数?

如何组合返回写入器[List[Int],Int]的函数?
EN

Stack Overflow用户
提问于 2015-08-28 16:07:35
回答 1查看 77关注 0票数 3

假设我有几个Int => IntandThen组成的函数

代码语言:javascript
复制
val f1: Int => Int = _ + 1
val f2: Int => Int = _ + 2
val f3: Int => Int = _ + 3

val f = f1 andThen f2 andThen f3

现在我还需要返回中间结果。因此,我可以将所有这些函数转换为包含参数的列表中的Int => (List[Int], Int)

我可能可以使用Writer[List[Int], Int] of scalaz来表示对(List[Int], Int)

代码语言:javascript
复制
val fw1: Int => Writer[List[Int], Int] = x => f1(x).set(List(x))
val fw2: Int => Writer[List[Int], Int] = x => f2(x).set(List(x))
val fw3: Int => Writer[List[Int], Int] = x => f3(x).set(List(x))

为了编写fw1fw2fw3,我可能需要用Kleisli包装它们。但是,Kleisli(fw1)不编译,因为Writer[List[Int], Int]不是单曲。

我想我可能需要一个monad transformer来使Writer[List[Int], Int]成为一个单曲,但我不知道具体如何做。因此,我的问题是:如何使Kleisli(fw1)使用单台转换器进行编译?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-28 18:30:04

Writer[List[Int], ?]确实有一个单一的实例--这只是一个没有一点帮助就无法看到的情况。您可以只使用kleisliU,它类似于Kleisli.apply,但有一些来自Unapply的类型推断帮助(它描述了这里并在许多其他地方进行了描述):

代码语言:javascript
复制
import scalaz._, Scalaz._, Kleisli.kleisliU

val f1: Int => Int = _ + 1
val f2: Int => Int = _ + 2
val f3: Int => Int = _ + 3

val fw1: Int => Writer[List[Int], Int] = x => f1(x).set(List(x))
val fw2: Int => Writer[List[Int], Int] = x => f2(x).set(List(x))
val fw3: Int => Writer[List[Int], Int] = x => f3(x).set(List(x))

val f = kleisliU(fw1) andThen kleisliU(fw2) andThen kleisliU(fw1)

然后:

代码语言:javascript
复制
scala> f.run(10)
res0: scalaz.WriterT[[+X]X,List[Int],Int] = WriterT((List(10, 11, 13),14))

还可以为Kleisli.applyKleisli.kleisli提供显式类型参数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32275349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档