scala中的提升函数

scala中的提升函数,scala,Scala,我想用它来定义提升。假设我们有一个函数a=>B,我想定义如何将它提升到Maybe,即Maybe[a]=>Maybe[B] 这可以通过隐式转换简单地完成。但是,如果我想对具有两个或多个参数的函数执行相同的操作,我有一个问题。我知道的唯一解决办法是复制代码 我想为任意函数实现这样的提升,这些函数具有任意数量的参数,而不存在重复。这在Scala中可能吗?如果F有可用的函子实例,则可以将任何函数a=>B提升到F[a]=>F[B] 如果F有一个可用的applicative functor实例,则可以提升任

我想用它来定义提升。假设我们有一个函数a=>B,我想定义如何将它提升到Maybe,即Maybe[a]=>Maybe[B]

这可以通过隐式转换简单地完成。但是,如果我想对具有两个或多个参数的函数执行相同的操作,我有一个问题。我知道的唯一解决办法是复制代码


我想为任意函数实现这样的提升,这些函数具有任意数量的参数,而不存在重复。这在Scala中可能吗?

如果
F
有可用的函子实例,则可以将任何函数
a=>B
提升到
F[a]=>F[B]

如果
F
有一个可用的applicative functor实例,则可以提升任何函数
A=>B=>C=>Z
to
F[A]=>F[B]=>F[C]=>F[Z]
。从本质上讲,应用函子是任意数函子的推广

您可以了解函子和应用函子以及。还有一场精彩的演讲,涵盖了这些想法

Scalaz库提供了这些抽象(以及更多!)

导入scalaz_
进口Scalaz_
scala>valfoo:Int=>String=\uu0.toString
foo:Int=>String=
scala>foo.lift[选项]
res0:Option[Int]=>Option[String]=
scala>res0(部分(3))
res1:Option[String]=Some(3)
scala>res0(无)
res2:选项[字符串]=无
scala>val add:(Int,Int)=>Int=u+_
加:(Int,Int)=>Int=
scala>add.lift[选项]
res3:(选项[Int],选项[Int])=>选项[Int]=
scala>res3(一些(2),一些(1))
res4:Option[Int]=Some(3)
scala>res3(部分(2),无)
res5:选项[Int]=无
scala>res3(无,无)
res6:选项[Int]=无
Scalaz皮条客在
Function2
Function3
等上使用
lift
方法,因为语法较重的常用函数使用较少。在幕后,提升通过
Function1
s(即curried函数)进行


您可能还想看一看。

这可能值得一看:看一看,注意tuple函数。还有元组和非元组方法。奇怪的是,
foo.lift[Option]
没有使用Scalaz 7编译,但是
add.lift[Option]
does@NikitaVolkov,只是在这里猜测一下。。。1. <代码>函子[Option].lift(foo)和
Applicative[Option].lift2(add)
可能有效。现在公开的“扩展方法”更少了。2.大多数扩展方法仍然可以在一个包
scalaz.syntax
中使用。您正在寻找的
电梯可能就在那里。上面的代码应该在Scalaz 7.1和Scala 2.11.5上运行吗?
import scalaz._
import Scalaz._

scala> val foo: Int => String = _.toString
foo: Int => String = <function1>

scala> foo.lift[Option]
res0: Option[Int] => Option[String] = <function1>

scala> res0(Some(3))
res1: Option[String] = Some(3)

scala> res0(None)
res2: Option[String] = None

scala> val add: (Int, Int) => Int = _ + _
add: (Int, Int) => Int = <function2>

scala> add.lift[Option]
res3: (Option[Int], Option[Int]) => Option[Int] = <function2>

scala> res3(Some(2), Some(1))
res4: Option[Int] = Some(3)

scala> res3(Some(2), None)
res5: Option[Int] = None

scala> res3(None, None)
res6: Option[Int] = None