gpt4 book ai didi

function - Scala 中的 "lifting"是什么?

转载 作者:行者123 更新时间:2023-12-02 10:28:50 24 4
gpt4 key购买 nike

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

Lift 存在额外的困惑框架的名字里有lifting,但它无助于回答问题。

Scala 中的“提升”是什么?

最佳答案

有几种用法:

部分函数

记住 PartialFunction[A, B] 是为域 A 的某个子集定义的函数(由 isDefinedAt 方法指定) )。您可以将 PartialFunction[A, B]“提升”为 Function[A, Option[B]]。也就是说,在 A整个上定义的函数,但其​​值的类型为 Option[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-expansion(感谢@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 => Int)实例(即它是一个) >

仿函数

仿函数(由scalaz定义)是一些“容器”(我极其宽松地使用术语),F 这样,如果我们有一个 F[A] 和一个函数 A => B,那么我们就可以获得一个 F[ B] (例如,F = Listmap 方法)

我们可以按如下方式编码该属性:

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

这与能够将函数A => B“提升”到仿函数的域中是同构的。即:

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

也就是说,如果F是一个仿函数,并且我们有一个函数A => B,那么我们就有一个函数F[A] => F [B]。您可以尝试实现 lift 方法 - 这非常简单。

Monad 变形金刚

正如 *hcoopz* 下面所说(我刚刚意识到这可以让我免于编写大量不必要的代码),术语“lift”在 **Monad Transformers** 中也有一个含义。回想一下,monad 转换器是一种将 monad 相互“堆叠”的方式(monad 不组合)。

例如,假设您有一个返回 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) => C

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]

关于function - Scala 中的 "lifting"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17965059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com