web-dev-qa-db-ja.com

「リフト表示」とは何ですか?

ここでこの用語に出くわしただけです:

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

「Flow API(リフトされた表現)と、リフトされた表現を実行表現に変換するプラグイン可能な方法(フローマテリアライゼーション)をデモします。」

グーグル操作はあまり役に立ちませんでした。

12
Den

Flow APIに慣れていません。

「リフティング」という用語は、カテゴリー理論に由来します。 HaskellやScalaなどのプログラミング言語では、lift関数は関数_A => B_を取り、何らかの形でマジックを実行して、リフトされた関数_F[A] => F[B]_をファンクターまたはモナド_F[A]_。

ScalaのSeqコンテナーを使用した具体的な例:関数def double(x: Int): Int = 2 * xとシーケンスval xs = Seq(1, 2, 3)があるとします。型に互換性がないため、double(xs)を実行できません。しかし、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インスタンスに持ち上げるリフティング操作と見なすこともできるため、これらの値にリストの抽象化を使用できます。

モナドを使用すると、防水で構成可能なインターフェースを提供することで、あるタイプの内部の仕組みをカプセル化できます。リフトされた表現を使用すると、計算を推論しやすくなります。このような抽象化を使用すると、抽象化された詳細の知識が失われますが、内部で効率的な実装を提供するために必要です(適切な実行表現を見つける)。

22
amon

もちろん、リフトするという用語は、コンテキストに応じて異なる意味を持つ可能性があります。

generic programming では、次の上位レベルに抽象化するプロセスを説明しています。たとえば、intを使用したタイプとfloatを使用したタイプの2つのコードを作成できます。このコードを持ち上げると、Tintの両方で機能するジェネリック型floatでメソッドをテンプレート化するようなものになります。

この用語の使用法は、liftingが何を意味するかについての直感的なガイドラインであることがわかりました。異なるコンテキスト間に存在するように見える唯一の違いは、このより高い抽象化が実際に何であるかです。

特に、Viktorは関数型プログラミングのコンテキストで知られており、このコンテキストでは、目に見える リフティングの異なる解釈 がそこにあります。 1つの例として、値をファンクタに持ち上げたり、関数を持ち上げてモナディック値(つまりHaskellの_liftM2_)を処理したりします。

その場合、「リフトされた表現」の非常に具体的な例は、f.ex。 List(1)またはSome(1)です。

6
Frank

これらの種類の概念は、通常、具体例を使用して理解するのが最も簡単です。この 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)がシームレスに収集しますその出力を1つのプロセッサに出力して印刷します。

これは、あらゆるタイプのあらゆるコンテキストをラップすることを指す一般的な用語です。もう1つのより一般的な例は、mapが単一の要素で機能する関数を取り、それらの要素のコレクションで作業するという新しいコンテキストに「持ち上げ」ます。リフティングは関数型プログラミングの至る所にあり、主な理由の1つは、関数型コードを再利用することが非常に簡単です。

4
Karl Bielefeldt