加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scalaz Kleisli的使用益处

发布时间:2020-12-16 18:52:57 所属栏目:安全 来源:网络整理
导读:在 scalaz中,Kleisli [M [_],A,B]是A =的包装器. M [B],允许组合这些功能.例如,如果M [_]是monad,我可以用 =组成Kleisli [M,B]和Kleisli [M,B,C].得到Kleisli [M,C]. 简而言之,Kleisli根据M提供花式和Thens.这是正确的吗?使用Kleisli还有其他好处吗? 解决
在 scalaz中,Kleisli [M [_],A,B]是A =>的包装器. M [B],允许组合这些功能.例如,如果M [_]是monad,我可以用> =>组成Kleisli [M,B]和Kleisli [M,B,C].得到Kleisli [M,C].

简而言之,Kleisli根据M提供花式和Thens.这是正确的吗?使用Kleisli还有其他好处吗?

解决方法

这有两个好处作为例子 – 我相信你可以拿出其他人.

首先,抽象不同的箭头是有用的,例如Kleisli [M,?,?]和? => ?.例如,我可以编写一个通用函数,它将内部结构应用一定次数.

def applyX10[Arr[_,_]: Category,A](f: Arr[A,A]) =
  List.fill(10)(Endomorphic(f)).suml

现在我可以使用它,例如Int => Int或Kleisli [Option,Int,Int]:

val f = (_: Int) + 1

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

然后:

scala> applyX10(f).run(1)
res0: Int = 11

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

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

其次,如果F确实如此,Kleisli [F,?]具有monad实例的事实也是有用的.请参阅例如my answer here,以演示如何使用ReaderT使用monadic合成,这只是Kleisli的别名.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读