加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

起吊功能在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读