これは、ここで FP を理解している人にとっては非常に明白に思えるかもしれませんが、Scala のポイントフリー スタイルは何の役に立つのでしょうか? このトピックで本当に私を売り込むのは、ポイントフリースタイルが、非ポイントフリースタイルで同じ問題を解決するコードよりも、ある次元 (パフォーマンス、エレガンス、拡張性、保守性など) でいかに優れているかを示す図です。
4 に答える
簡単に言えば、必要のない場所に名前を指定することを避けることができるということです。簡単な例を考えてみましょう:
List("a","b","c") foreach println
この場合、 String を受け入れて Unit を返す関数であるforeach
を受け入れようString => Unit
としています (基本的に、使用可能な戻り値はなく、純粋に副作用によって機能します)。
に渡される各 String インスタンスにここで名前をバインドする必要はありませんprintln
。おそらく、そうするためにコードがより冗長になるだけです。
List("a","b","c") foreach {println(_)}
あるいは
List("a","b","c") foreach {s => println(s)}
個人的には、ポイントフリー スタイルで書かれていないコードを見たときは、バインドされた名前が 2 回使用されているか、コードを文書化する上で何らかの意味があることを示していると考えています。同様に、ポイントフリー スタイルは、コードについてより簡単に推論できる兆候だと考えています。
ポイントフリー スタイルの一般的な魅力の 1 つは、多数の「ポイント」(関数ではなく値) があちこちに散らばっていないことです。これらのポイントは、計算をスレッド化するためにいくつかの場所で繰り返さなければなりません。間違いを犯す機会が少なくなります。 、たとえば、変数の名前を入力するとき。
ただし、ポイントフリーの利点は、Scala では型を推論するわずかな能力によってすぐに相殺されます。この事実は、「ポイント」が型推論の手がかりとして機能するため、ポイントフリー コードによって悪化します。ほとんど完全な型推論を備えた Haskell では、これは通常問題になりません。
「エレガンス」以外の利点はないと思います。少し短く、読みやすいかもしれません。これにより、関数の適用に対して精神的に「より深いレベル」に入ることなく、関数をエンティティとして推論することができますが、もちろん、最初に慣れる必要があります。
それを使うことでパフォーマンスが向上する例を私は知りません (メソッドで十分な場合に関数になってしまうと、パフォーマンスが低下する可能性があります)。
Scala のポイントフリー構文は、魔法の Scala 演算子 (関数である) の一部です。最も基本的な演算子でさえ関数です:
例えば:
val x = 1
val y = x + 1
...と同じです...
val x = 1
val y = x.+(1)
...しかしもちろん、ポイントフリー スタイルの方が自然に読めます (プラスは演算子のように見えます)。