只是在这里遇到了这个词:
http://www.codemesh.io/codemesh2014/viktor-klang
“我们将演示Flow API(提升的表示形式),以及将提升的表示形式转换为执行表示形式的可插入方式-Flow Materialization。”
谷歌搜索没有太大帮助。
只是在这里遇到了这个词:
http://www.codemesh.io/codemesh2014/viktor-klang
“我们将演示Flow API(提升的表示形式),以及将提升的表示形式转换为执行表示形式的可插入方式-Flow Materialization。”
谷歌搜索没有太大帮助。
Answers:
我对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, 3
为Seq
实例,从而使我们能够使用列表抽象这些值。
Monads通过提供防水但可组合的界面,使我们能够封装某种类型的内部结构。使用提升的表示形式可以使推理计算更加容易。使用这样的抽象还意味着我们会失去对抽象细节的了解,但是对于在后台提供有效的实现(找到合适的执行表示)而言,这些细节是必需的。
+
定义为的运算符int + int --> int
。提升为可为空的运算符int? + int? --> int?
的语义为“如果任一操作数为null,则答案为null,否则对值使用非提升的运算符”。
A
和B
,以及一个F
作为类型构造函数的函子。
F
是类型构造函数,则它F[A]
是其构造类型之一。那么为什么说这四种类型是错误的呢?(当然,两种类型和一种类型的构造函数也一样)
根据上下文,术语“ 提升 ”当然可以具有不同的含义。
在通用编程中,它描述了抽象到更高级别的过程。例如,您可能有两段代码,一种使用int
,而另一种使用float
。这个吊码将意味着像与通用型模板化的方法T
,对于这两种工作,int
和float
。
我发现此术语的使用对于提升的含义是一个很好的直观指导。似乎在不同上下文之间存在的唯一区别是这种更高的抽象实际上是什么。
特别是在函数式编程的背景下,Viktor是众所周知的,在这种情况下,您可以在此处找到有关提升的明显不同的解释。一个示例是将值提升到一个函子中,或者提升函数以使用单值(例如,Haskell的liftM2
)。
然后,可以举一个“举止表示”的非常具体的例子。是List(1)
或Some(1)
。
通常,通过一个具体示例最容易理解这类概念。请考虑以下这个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
将一个功能应用于单个元素,然后将其“提升”到处理这些元素的集合的新上下文中。提升在函数式编程中无处不在,这是重用函数式代码非常容易的主要原因之一。