首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“那么,关于不同输入类型的Kleisli?”

“那么,关于不同输入类型的Kleisli?”
EN

Stack Overflow用户
提问于 2017-09-20 13:13:07
回答 2查看 109关注 0票数 1

给予:

代码语言:javascript
复制
import scalaz._, Scalaz._
import scalaz.concurrent.Task

case class AppConfig(x: Int, y: String)

val x = Kleisli[Task, Int, Boolean] { 
   case i: Int => if (i === 42) Task.now(true) else Task.now(false)
}

val y = Kleisli[Task, String, Unit] { 
    case s: String => Task.delay { println(s"$s was here") } 
}

由于编译失败,我无法调用x >> y

代码语言:javascript
复制
scala> x >> y
<console>:21: error: type mismatch;
 found   : scalaz.Kleisli[scalaz.concurrent.Task,String,Unit]
 required: scalaz.Kleisli[scalaz.concurrent.Task,Int,?]
       x >> y
            ^

因此,将xy的类型从Kleisli[Task, Int, Boolean]Kleisli[Task, String, Boolean]改为Kleisli[Task, AppConfig, Boolean]是否合理?

如果没有,请提出一个更好的替代方案和你的理由。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-20 15:56:58

我想你要找的是

代码语言:javascript
复制
x *** y

这会给你Kleisli[Task, (Int, String), (Boolean, Unit)]

***来自于Arrow语法,它意味着并行组合(而不是>>=>>的顺序组合)。

票数 2
EN

Stack Overflow用户

发布于 2017-09-21 08:30:27

下面是所发生的事情:因为在Scalaz中,Kleisli[M, A, B]可以被解释为Scala函数A => M[B],所以有内置的reader实例,在本例中使用。Reader是在函数R => M[A]上定义的,它是从固定类型R读取的。因此,您需要输入类型的Kleisli箭头来匹配,以便使用它,但情况并非如此。Kleisli组合( >=> )也不可用:它需要第一个Kleisli (签名中的B)的结果类型来匹配第二个输入类型的A。您可以提供参数并向下移动到Task级别:

代码语言:javascript
复制
x(42) >> y("abc")

或者,如果您希望保持在Kleisli级别,您可能希望使用平行箭头组合,如其他答案中所述:

代码语言:javascript
复制
import scalaz.syntax.arrow._ // if you're not importing whole Scalaz
import Function.const
(x *** y).map(const()) // use map to ignore result

请注意,这也意味着您最终需要提供您的论点。

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

https://stackoverflow.com/questions/46323046

复制
相关文章

相似问题

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