在Scala(猫或scalaz)中转换仿函数(F [A] => G [A])

llo*_*eta 4 types functional-programming scala scalaz scala-cats

在Cats或Scalaz中是否存在可在不同容器类型之间进行转换的类型类?例如

  • 选项〜>试试
  • 试试〜>未来
  • 试试〜>要么
  • 选项〜>列表

似乎FunctionK/ ~>/ NaturalTransformation可能是我正在寻找的,但没有任何实例为他们定义,我不知道为什么.

Yuv*_*kov 5

自然变换是您正在寻找的.它们定义了仿函数之间的态射(在本例中,是List[A]Option[A]类型构造函数).您可以使用~>Scalaz中的"运算符" 定义一个:

def main(args: Array[String]): Unit = {
  val optionToList = new (Option ~> List) {
    override def apply[A](fa: Option[A]): List[A] = fa.toList
  }

  println(optionToList(Some(3)))
  println(optionToList(None))
}
Run Code Online (Sandbox Code Playgroud)

产量:

List(3)
Nil
Run Code Online (Sandbox Code Playgroud)

~>是特质的合成糖NaturalTransformation[-F[_], +G[_]]:

/** A universally quantified function, usually written as `F ~> G`,
  * for symmetry with `A => B`.
  */
trait NaturalTransformation[-F[_], +G[_]] {
  self =>
  def apply[A](fa: F[A]): G[A]

  // Abbreviated for the answer
}
Run Code Online (Sandbox Code Playgroud)