276

Scala エコシステムの記事を読んでいると、"lifting" / "lifted" という用語を読むことがあります。残念ながら、それが正確に何を意味するのかは説明されていません。調べてみたところ、リフティングは機能的価値などと関係があるようですが、実際にリフティングとは何かを初心者向けに説明しているテキストを見つけることができませんでした.

名前にリフティングが含まれるLiftフレームワークにはさらに混乱がありますが、質問への回答には役立ちません。

Scalaの「リフティング」とは?

4

4 に答える 4

26

PartialFunction[Int, A](oxbow_lakes で指摘されているように)拡張するコレクションはすべて解除される可能性があることに注意してください。したがって、たとえば

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

部分関数を、コレクションで定義されていない値がマップされる合計関数に変換しますNone

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

これは、インデックスの範囲外の例外を回避するための巧妙なアプローチを示しています。

于 2015-04-21T07:37:16.677 に答える
21

私が論文 (必ずしも Scala 関連のものではない) で遭遇したリフティングの別の使用法は、 f: A -> Bwith f: List[A] -> List[B](またはセット、マルチセットなど) からの関数のオーバーロードです。fこれは、個々の要素に適用されるか、複数の要素に適用されるかは問題ではないため、形式化を単純化するためによく使用されます。

この種のオーバーロードは、多くの場合、宣言的に行われます。たとえば、

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
于 2013-07-31T08:43:10.260 に答える