Kleisli就是函数A=>M[B]的类封套,从Kleisli的类定义可以看出:scalaz/Kleisli.scala 1 final case class Kleisli[M[_], A, B](run / 5 def kleisli[M[_], A, B](f: A => M[B]): Kleisli[M, A, B] = Kleisli(f) 6 ... ` */ 2 def >=>[C](k: Kleisli[M, B, C])(implicit b: Bind[M]): Kleisli[M, A, C] = kleisli((a: A) => Kleisli[M, C, B] = k >=> this 12 13 def compose[C](k: Kleisli[M, C, A])(implicit b: Bind[M]): Kleisli 函数组合操作 7 import Kleisli._ 8 val kfg = kleisli(kf) >=> kleisli(kg) //> kfg : scalaz.Kleisli
scala的函数式组件库cats提供了一个Kleisli类型,reader monad就是从它推导出来的: final case class Kleisli[M[_], A, B](run: A => trait KleisliFunctions { /**Construct a Kleisli from a Function1 */ def kleisli[M[_], A, B](f: A => M[B]): Kleisli[M, A, B] = Kleisli(f) … def >=>[C](k: Kleisli[M, B, C])(implicit b: Bind[M]): Kleisli[M, A, C] = kleisli((a: A) => b.bind(this(a))(k.run)) … Kleisli的用途就是进行函数的转换 // (A=>M[B]) >=> (B=>M[C]) >=> (C=>M[D]) = M[D] 实际上Kleisli就是ReaderT: type ReaderT[F[_], E, A] = Kleisli
{ExecutorService,Executors} 2 type Delegated[A] = Kleisli[Task,ExecutorService,A] 3 def delegate: Delegated [ExecutorService] = Kleisli(e => Task.now(e)) 4 //> delegate: => demo.ws.task.Delegated java.util.concurrent.ExecutorService] 5 implicit def delegateTaskToPool[A](ta: Task[A]): Delegated[A] = Kleisli delegate 9 b <- Task("x")(p) 10 c <- Task("y")(p) 11 } yield c //> tPrg : scalaz.Kleisli scalaz.concurrent.Task,java.util.concurrent.Executor 12 //| Service,String] = Kleisli
A=>[B]是瑞士数学家Heinrich Kleisli法则的箭头(Kleisli Arrow)。 我们可以用Kleisli Arrow来实现一个函数compose: def compose[A,B,C](f: A=>[B], g: B=>M[C]): A=>M[C]。
OnOffDevice,不需要实现依赖项目就可以直接使用这些Reader功能函数: 1 ef trigger = OnOffService.on //> trigger: => scalaz.Kleisli extends OnOffDeviceImpl 2 def trigger = OnOffService.on //> trigger: => scalaz.Kleisli extends Device with DeviceImpl 2 def trigger = OnOffService.on //> trigger: => scalaz.Kleisli
identity):m >>= return ≡ m 结合律(Associativity):(m >>= f) >>= g ≡ m >>= (\x -> f x >>= g) 单位元的性质看起来不很明显,可以借助Kleisli composition转换成更标准的形式: -- | Left-to-right Kleisli composition of monads. (>=>) :: Monad m => (a 没错,就是<=< 用Kleisli composition(>=>)来描述Monad laws: 左单位元:return >=> f ≡ f 右单位元:f >=> return ≡ f 结合律:(f >
(subtract 1)) 7 4.0 monadic function也是function,自然也能组合(实际上之前已经见过了) 在Monad laws中有提到过一个东西,叫做Kleisli composition : -- | Left-to-right Kleisli composition of monads. (>=>) :: Monad m => (a -> m b) -> (b -> m c
hasCoffee) OnOffService.on else OnOffService.off } yield onoff //> trigger: (cntry: String)scalaz.Kleisli
<- e3(a,b) 12 d <- e2(c) 13 } yield d //> prg : scalaz.Kleisli [scalaz.Id.Id,Int,Int] = Kleisli(<function1>) 14 prg.run(10) //
(通信)信道的概念在其他地方广泛使用,有各种名称,如条件概率、随机矩阵、概率分类器、马尔可夫核、条件概率表(在贝叶斯网络中)、概率函数/计算、信号(在贝叶斯说服理论中),最后称为 Kleisli 映射(
cats同样实现了几个类型的MonadTransformer如:OptionT、EitherT、StateT、WriterT、Kleisli等等,命名方式都是以类型名称尾缀加T的规范方式,如: final
涉及 BG 门控的计算可以形式化地描述为单子 T 的克莱斯利范畴 (Kleisli category) Kl(T) 中的态射。
涉及 BG 门控的计算可以形式化地描述为单子 T 的克莱斯利范畴 (Kleisli category) Kl(T) 中的态射。