起吊功能在scala
发布时间:2020-12-16 19:05:30 所属栏目:安全 来源:网络整理
导读:我想用意图来定义提升.假设我们有一个函数A = B,我想定义如何将它提升到Maybe,即Maybe [A] =也许[B]. 这可以简单地用隐式转换完成.但是,如果我想对具有两个或多个参数的函数做同样的事情,我有一个问题.我唯一的解决方案是复制代码. 我想用任意数量的参数实现
我想用意图来定义提升.假设我们有一个函数A => B,我想定义如何将它提升到Maybe,即Maybe [A] =>也许[B].
这可以简单地用隐式转换完成.但是,如果我想对具有两个或多个参数的函数做同样的事情,我有一个问题.我唯一的解决方案是复制代码. 我想用任意数量的参数实现任意功能的提升,而不会重复.这是否可能在Scala? 解决方法
如果F具有可用的函数实例,则可以提取任何函数A => B到F [A] => F [B].
如果F具有可用的应用函数实例,则可以提取任何函数A => B => C => .. => Z到F [A] => F [B] => F [C] => .. => F [Z].本质上,应用函数是任意伪函数的泛化. 您可以了解functor和应用函数here和here.还有this优秀的讲座涵盖了这些想法. Scalaz库提供了这些抽象(和更多!). 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 由于Curly函数在句法上较重,所以在Function2,Function3等上的Scalaz皮条客提升方法的使用较少.在幕后,功能1(即咖喱功能)发生提升. 你可能还想看看Scalaz source code. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |