我经常写这样的代码:
abstract class Foo [T[+_]: Monad]
{
def getStr (): T[String]
}
object Example
{
def f [T[+_]: Monad] (bar: String): ReaderT[T, Foo[T], String] = {
Kleisli { foo =>
for {
str <- foo.getStr ()
} yield str + bar
}
}
}
我知道上面的代码是做什么的,但是我并不完全理解Kleisli
部分的内部工作原理。
查看源代码我可以看到Kleisli
类型表示一个接受类型的函数,并返回以更高阶类型包装的另一个类型:
/**
* Represents a function `A => M[B]`.
*/
如何用它来解释我上面发布的例子?
Kleisli
可以使用哪些其他内容?