Scala `然后在克莱斯利';不同的输入类型?

Scala `然后在克莱斯利';不同的输入类型?,scala,scalaz,Scala,Scalaz,鉴于: 由于编译失败,我无法调用x>>y: 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[T

鉴于:

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

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") } 
}
scala>x>>y
:21:错误:类型不匹配;
找到:scalaz.Kleisli[scalaz.concurrent.Task,String,Unit]
必需:scalaz.Kleisli[scalaz.concurrent.Task,Int,?]
x>>y
^
因此,将
x
y
的类型从
Kleisli[Task,Int,Boolean]
Kleisli[Task,String,Boolean]
更改为
Kleisli[Task,AppConfig,Boolean]
是否合理


如果没有,请提出一个更好的选择和你的理由。

我想你想要的是

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
            ^
这将为您提供
Kleisli[Task,(Int,String),(Boolean,Unit)]


***
来自
箭头
语法,意思是并行组合(与
>=
>
的顺序组合相反)。

事情是这样的:因为在Scalaz
中,Kleisli[M,A,B]
可以解释为Scala函数
A=>M[B]
,它有一个内置的读卡器monad实例,在本例中使用。读卡器monad是在函数
R=>M[A]
上定义的,从固定类型
R
读取。因此,您需要匹配
Kleisli
箭头的输入类型才能使用它,但实际情况并非如此。Kleisli组合,
=>
,也不可用:它要求第一个
Kleisli
B
,在签名中)的结果类型与第二个的输入类型
A
匹配。您可以提供参数并向下移动到
任务
级别:

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

x(42) >> y("abc")
请注意,这也意味着您最终需要提供您的论点

import scalaz.syntax.arrow._ // if you're not importing whole Scalaz
import Function.const
(x *** y).map(const()) // use map to ignore result