当前位置: 首页 > 知识库问答 >
问题:

Scala中的“提升”是什么?

魏风华
2023-03-14

有时,当我阅读Scala生态系统中的文章时,我会读到术语“提升”/“提升”。不幸的是,没有解释这到底意味着什么。我做了一些研究,似乎举重与功能值或诸如此类的东西有关,但我找不到一篇文本,以初学者友好的方式解释举重到底是什么。

升降机框架的名称中有升降机,但这无助于回答这个问题。

Scala中的“提升”是什么?

共有3个答案

周越泽
2023-03-14

我在论文中遇到的另一个提升用法(不一定是与Scala相关的)是从f:a重载函数-

这种重载通常是以声明方式完成的,例如,

f: List[A] -> List[B]
f(xs) = f(xs(1)), f(xs(2)), ..., f(xs(n))

f: Set[A] -> Set[B]
f(xs) = \bigcup_{i = 1}^n f(xs(i))

或命令,例如,

f: List[A] -> List[B]
f(xs) = xs map f
乐正穆冉
2023-03-14

注:任何扩展部分功能(如oxbow\u lakes所指出)的集合都可以取消;因此,例如

Seq(1,2,3).lift
Int => Option[Int] = <function1>

它将部分函数转换为总函数,其中集合中未定义的值映射到上,

Seq(1,2,3).lift(2)
Option[Int] = Some(3)

Seq(1,2,3).lift(22)
Option[Int] = None

此外

Seq(1,2,3).lift(2).getOrElse(-1)
Int = 3

Seq(1,2,3).lift(22).getOrElse(-1)
Int = -1

这显示了一种避免索引越界异常的简洁方法。

郜昊苍
2023-03-14

有几种用法:

请记住,部分函数[a,B]是为域a的某个子集定义的函数(由isDefinedAt方法指定)。您可以将部分功能[a,B]提升为功能[a,选项[B]]。也就是说,在整个a上定义的一个函数,但其值属于选项B类型

这是通过显式调用PartialFunction上的方法lift来完成的。

scala> val pf: PartialFunction[Int, Boolean] = { case i if i > 0 => i % 2 == 0}
pf: PartialFunction[Int,Boolean] = <function1>

scala> pf.lift
res1: Int => Option[Boolean] = <function1>

scala> res1(-1)
res2: Option[Boolean] = None

scala> res1(1)
res3: Option[Boolean] = Some(false)

您可以将方法调用“提升”到函数中。这称为eta扩展(感谢Ben James)。例如:

scala> def times2(i: Int) = i * 2
times2: (i: Int)Int

我们通过应用下划线将方法提升到函数中

scala> val f = times2 _
f: Int => Int = <function1>

scala> f(4)
res0: Int = 8

注意方法和函数之间的根本区别。res0是(函数)类型(Int=

仿函数(由calaz定义)是一些“容器”(我非常松散地使用术语),F这样,如果我们有一个F[A]和一个函数A=

我们可以将此属性编码如下:

trait Functor[F[_]] { 
  def map[A, B](fa: F[A])(f: A => B): F[B]
}

这与能够“提升”函数A=同构

def lift[F[_]: Functor, A, B](f: A => B): F[A] => F[B]

也就是说,如果F是一个仿函数,并且我们有一个函数A=

正如hcoopz在下面所说的(我刚刚意识到这可以避免我编写大量不必要的代码),术语“lift”在Monad Transformers中也有其含义。回想一下,单子变换器是一种将单子“堆叠”在彼此之上的方式(单子不组合)。

因此,例如,假设您有一个返回IO[Stream[A]]的函数。这可以转换为monad转换器StreamT[IO, A]。现在您可能希望“提升”一些其他值一个IO[B]也许它也是一个StreamT。您可以这样写:

StreamT.fromStream(iob map (b => Stream(b)))

或者这个:

iob.liftM[StreamT]

这就引出了一个问题:为什么我要将IO[B]转换为StreamT[IO, B]?答案是“利用组合的可能性”。假设您有一个函数f:(A, B)=

lazy val f: (A, B) => C = ???
val cs = 
  for {
    a <- as                //as is a StreamT[IO, A]
    b <- bs.liftM[StreamT] //bs was just an IO[B]
  }
  yield f(a, b)

cs.toStream //is a Stream[IO[C]], cs was a StreamT[IO, C]

 类似资料:
  • 问题内容: 这是Node http事件之一 。进行了明显的Google搜索,却发现了很多。究竟是什么? 问题答案: HTTP升级用于指示偏好或要求,以切换到其他版本的HTTP或其他协议(如果可能): 升级通用标头允许客户端指定其支持的其他通信协议,并在服务器认为适合切换协议时使用。服务器必须使用101(交换协议)响应中的Upgrade标头字段来指示正在交换的协议。 例如, 升级标头字段旨在提供一种

  • 本文向大家介绍react的状态提升是什么?使用场景有哪些?相关面试题,主要包含被问及react的状态提升是什么?使用场景有哪些?时的应答技巧和注意事项,需要的朋友参考一下 React的状态提升就是用户对子组件操作,子组件不改变自己的状态,通过自己的props把这个操作改变的数据传递给父组件,改变父组件的状态,从而改变受父组件控制的所有子组件的状态,这也是React单项数据流的特性决定的。 官方的原

  • 问题内容: 您将如何在PySpark中使用和/或实现等效的案例类? 问题答案: 正如Alex Hall[所提到的,命名产品类型的真实等效项是。 与在其他答案中建议的不同,它具有许多有用的属性: 具有明确定义的形状,可以可靠地用于结构模式匹配: FooBar = namedtuple(“FooBar”, [“foo”, “bar”]) foobar = FooBar(42, -42) foo, ba

  • 本文向大家介绍详解javascript中的变量提升和函数提升,包括了详解javascript中的变量提升和函数提升的使用技巧和注意事项,需要的朋友参考一下 1在js中只有两种作用域 a:全局作用域 b:函数作用域 在ES6之前,js是没有块级作用域。 首先来解释一下什么是没有块级作用域? 所以此时 是可以打印输出变量a的值。 2:什么是变量提升? 在我们的js中,代码的执行时分两步走的,1、解析

  • 问题内容: 为什么JavaScript会提升变量? 设计师决定实施吊装时的基本原理是什么?还有其他流行的语言可以做到这一点吗? 请提供文档和/或记录的相关链接。 问题答案: 正如Stoyan Stefanov在“ JavaScript模式”一书中解释的那样,提升是JavaScript解释器实现的结果。 JS代码解释分两次进行。在第一遍中,解释器处理变量和函数声明。 第二遍是实际的代码执行步骤。解释

  • 热升级是什么呢?了解 nginx 的同学都知道,nginx 是支持热升级的,可以用老进程服务先前链接的链接,使用新进程服务新的链接,即在不停止服务的情况下完成系统的升级与运行参数修改。那么热升级和热编译是不同的概念,热编译是通过监控文件的变化重新编译,然后重启进程,例如 bee run 就是这样的工具 很多人认为 HTTP 的应用有必要支持热升级吗?那么我可以很负责的说非常有必要,不中断服务始终是