在 Scala(cats 或 scalaz)中转换仿函数(F[A] => G[A])
Converting functors (F[A] => G[A]) in Scala (cats or scalaz)
Cats 或 Scalaz 中是否有类型类可以在不同容器类型之间进行转换?例如
- 选项 ~> 尝试
- 尝试 ~> 未来
- 尝试 ~> 要么
- 选项 ~> 列表
似乎 FunctionK
/~>
/NaturalTransformation
可能是我要找的东西,但没有为它们定义任何实例,我不知道为什么。
自然变换正是您要找的。它们定义函子之间的态射(在这种情况下,List[A]
和 Option[A]
类型构造函数)。您可以使用 Scalaz 中的 ~>
"operator" 定义一个:
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))
}
产量:
List(3)
Nil
~>
是性状 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
}
Cats 或 Scalaz 中是否有类型类可以在不同容器类型之间进行转换?例如
- 选项 ~> 尝试
- 尝试 ~> 未来
- 尝试 ~> 要么
- 选项 ~> 列表
似乎 FunctionK
/~>
/NaturalTransformation
可能是我要找的东西,但没有为它们定义任何实例,我不知道为什么。
自然变换正是您要找的。它们定义函子之间的态射(在这种情况下,List[A]
和 Option[A]
类型构造函数)。您可以使用 Scalaz 中的 ~>
"operator" 定义一个:
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))
}
产量:
List(3)
Nil
~>
是性状 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
}