過去1年間、私はScalaコードを書いてきました(Javaのバックグラウンドから来ています)。vals、caseクラス、map / filter / lambda関数、暗黙的および型推論を使用して、よりシンプルでクリーンなコードを作成できる方法が本当に気に入りました。主にAkkaベースのアプリケーションに使用しました。
今年は、関数型プログラミングが大好きな新しいチームとScalaプロジェクトに参加しています。それらはScalazを頻繁に使用し、コードはあらゆる場所にapplicatives、context bounds、reader / writer / stateモナドで満たされ、メインメソッドもI / Oモナドに「ラップ」されます。彼らの推論は、これによりコンパイラがコードが正しいことを主張する際に「私たちのために働く」ようにし、各関数に副作用がないことです。
それでも、私の観点からすると、この構文はすべてビジネスロジックの邪魔になります。たとえば、「MyBusinessObject」のタイプは問題ありません。「List [MyBusinessObject]」、「Option [MyBusinessObject]」、「Future [MyBusinessObject]」などのタイプも同様です。それらはすべて明確な意味と目的を持っています。一方、次のようなコード:
def method[M[_]: Applicative] = {
case (a, b) => (ca[M](a) |@| cb[M](b)) {
case t @ (ra, rb) =>
if (ra.result && rb.result) t.right
else t.left
}
}
それはプログラムに複雑さを追加しますか、それとも私がこのプログラミング方法に慣れていないのは私だけですか?
>>=
および<$>
あなたまでその平均は何も、彼らが何をするかを知っています。しかし、彼らが何を意味するかを学んだ後、彼らは今、私にとって非常に自然かつ迅速に読みました。本当の答えではなく、このようなことに対する私の客観的な経験だけです。私もScalaを使用していますが、Scalazライブラリの経験はありません。
for(i=0; i<7; ++i) { trivialOperation(i); }
厄介なtrivialOperationCount
変数で書くことはないでしょうか?) OOでアクセサメソッド呼び出しを書き出すだけです。通常、結果はより簡潔です。おそらく少し自明ではありませんが、通常、データ宣言を調べるとすぐに明らかになります。静的型付けは非常に役立ちますが、APLとは異なります。