首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scalaz Kleisli的使用效益

Scalaz Kleisli的使用效益
EN

Stack Overflow用户
提问于 2015-03-14 12:54:13
回答 1查看 1.9K关注 0票数 7

黄玉中,Kleisli[M[_], A, B]A => M[B]的包装器,它允许合成这样的函数。例如,如果M[_]是monad,我可以用>=>编写Kleisli[M, A, B]Kleisli[M, B, C]以获得Kleisli[M, A, C]

简单地说,Kleisli提供了与M不同的高级andThens。是对的吗?使用Kleisli还有其他好处吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-14 18:10:02

这里有两个好处作为例子--我相信你会想到其他的。

首先,对不同的箭头(如Kleisli[M, ?, ?]? => ? )进行抽象是很有用的。例如,我可以编写一个泛型函数,该函数将应用特定次数的自同态。

代码语言:javascript
复制
def applyX10[Arr[_, _]: Category, A](f: Arr[A, A]) =
  List.fill(10)(Endomorphic(f)).suml

现在我可以在例如Int => IntKleisli[Option, Int, Int]上使用这个

代码语言:javascript
复制
val f = (_: Int) + 1

val k = Kleisli.kleisli[Option, Int, Int] {
  case i if i % 2 == 0 => Some(i * 3)
  case _ => None
}

然后:

代码语言:javascript
复制
scala> applyX10(f).run(1)
res0: Int = 11

scala> applyX10[=?>, Int](k).run(2)
res1: Option[Int] = Some(118098)

(请注意,A =?> B只是Kleisli[Option, A, B]的别名。)

其次,如果Kleisli[F, ?, ?]有一个单实例(如果F有),这一事实也可能是有用的。例如,请参阅我在这里的回答,演示如何在ReaderT中使用一元组合,这只是Kleisli的别名。

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

https://stackoverflow.com/questions/29049161

复制
相关文章

相似问题

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