什么是“解除代表权”?


12

只是在这里遇到了这个词:

http://www.codemesh.io/codemesh2014/viktor-klang

“我们将演示Flow API(提升的表示形式),以及将提升的表示形式转换为执行表示形式的可插入方式-Flow Materialization。”

谷歌搜索没有太大帮助。


推荐阅读:讨论此$ {blog}
2014年

11
@gnat似乎他没有发明这个术语,看起来不像是一种意见,不太可能引起讨论,我的直觉是它不会太宽泛(尽管感觉像数学)。
2014年

2
我在这里在C#的上下文中讨论“提升”的含义:blogs.msdn.com/b/ericlippert/archive/2007/06/27/…-可能是Scala开发人员正在使用类似的术语,但更多一般时尚。
埃里克·利珀特

Answers:


22

我对Flow API不熟悉。

术语“提升”来自类别理论。在诸如Haskell或Scala之类的编程语言中,一个lift函数接受一个函数A => B,然后以某种方式执行魔术,以便将提升后的函数F[A] => F[B]应用于函子或monad F[A]

一个使用Scala Seq容器的具体示例:假设我们有一个function def double(x: Int): Int = 2 * x和一个sequence val xs = Seq(1, 2, 3)。我们不能double(xs)由于类型不兼容而造成的。但是,如果获得a val doubleSeq = liftToSeq(double),我们可以做doubleSeq(xs),其结果为Seq(2, 4, 6)。在这里,liftToSeq可以实现为

def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
  (seq: Seq[A]) => seq.map(f)

Seq(…)构造也可以被看作是提升操作,这提升了价值1, 2, 3Seq实例,从而使我们能够使用列表抽象这些值。

Monads通过提供防水但可组合的界面,使我们能够封装某种类型的内部结构。使用提升的表示形式可以使推理计算更加容易。使用这样的抽象还意味着我们会失去对抽象细节的了解,但是对于在后台提供有效的实现(找到合适的执行表示)而言,这些细节是必需的。


4
这是对数学“提升”的很好描述。我们还应包括对Wikipedia中解除更正式描述的引用。
Scott Whitlock 2014年

3
“提升”的一个更清晰的例子是提升为可空(或“可选”或“也许”)类型。例如,假设您有一个+定义为的运算符int + int --> int。提升为可为空的运算符int? + int? --> int?的语义为“如果任一操作数为null,则答案为null,否则对值使用非提升的运算符”。
埃里克·利珀特

@ScottWhitlock你还抬吗?
Helrich 2014年

1
@Frank我在写答案之前先阅读了Wikipedia的文章,但也听不懂。相反,我发现LiftingHaskell Wiki更易于访问。请注意,我们实际上并没有四种类型。我们有四种具体类型,但只有三种类型变量:两个类型AB,以及一个F作为类型构造函数的函子。
阿蒙2014年

1
我对所有这些都不太了解,但是如果F是类型构造函数,则它F[A]是其构造类型之一。那么为什么说这四种类型是错误的呢?(当然,两种类型和一种类型的构造函数也一样)
弗兰克(Frank

6

根据上下文,术语“ 提升 ”当然可以具有不同的含义。

通用编程中,它描述了抽象到更高级别的过程。例如,您可能有两段代码,一种使用int,而另一种使用float。这个吊码将意味着像与通用型模板化的方法T,对于这两种工作,intfloat

我发现此术语的使用对于提升的含义是一个很好的直观指导。似乎在不同上下文之间存在的唯一区别是这种更高的抽象实际上是什么。

特别是在函数式编程的背景下,Viktor是众所周知的,在这种情况下,您可以在此处找到有关提升的明显不同的解释。一个示例是将值提升到一个函子中,或者提升函数以使用单值(例如,Haskell的liftM2)。

然后,可以举一个“举止表示”的非常具体的例子。是List(1)Some(1)


4

通常,通过一个具体示例最容易理解这类概念。请考虑以下这个Flow API示例的摘录:

Flow(text.split("\\s").toVector).
      // transform
      map(line => line.toUpperCase).
      // print to console (can also use ``foreach(println)``)
      foreach(transformedLine => println(transformedLine)).
      onComplete(FlowMaterializer(MaterializerSettings())) {
        case Success(_) => system.shutdown()
        case Failure(e) =>
          println("Failure: " + e.getMessage)
          system.shutdown()
      }

这需要以下代码:

text.split("\\s").toVector.
      map(line => line.toUpperCase).
      foreach(println)

并将其“提升”到Flow上下文中。这样一来,您就可以使用熟悉的语法来指定算法,但是在后台,这map是在多个处理器甚至机器上并行完成的,然后将foreach(println)输出无缝地收集回一个处理器进行打印。

这是一个通用术语,可以表示将任何上下文包装在任何类型周围。另一个更熟悉的示例是map将一个功能应用于单个元素,然后将其“提升”到处理这些元素的集合的新上下文中。提升在函数式编程中无处不在,这是重用函数式代码非常容易的主要原因之一。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.