まず、これらは実際には同等ではありません。 f $ x $ y
は、したがって、あなたが実際に、私は実際に好むstatement_1
は、実際には単一のシンボルである場合、
myFunction v1 v2 = (statement_1.. $ statement_2...) $ statement_3...
として最初のバージョンを書いたりする必要があると思います、f $ (x $ y)
(infixr 0 $
ため)として解析され
myFunction v1 v2 = statement_1 (statement_2...) (statement_3...)
本当にあなたの質問は、これらの中間結果の名前を自分自身に与えることが理にかなっているかどうかです。ハスケルとほとんど関係ない質問です。ほとんどのプログラミング言語に適用できますが、ハスケルのように1つの式で多く書くことはできません。それは、コードを分かりやすくするために名前を付けるだけで答えることができます。 statement_2 ...
は何のために良いのか分かりにくいかもしれませんが、 "一言コメント"はそれをクリアしますか?さて、それに名前をつけろ!代わりにそれはちょうど短い表現であり、それがどういう意味であるかはっきりしているなら、私は気にしません。
名前付きエンティティとして何かを定義するかどうかにかかわらず、パフォーマンス(複雑ささえも)に影響することがあります。 result_1
がv2
に依存しない長い計算である場合、それはそれをこのように書くことは理にかなって:
myFunction v1 = \v2 -> statement_1 result_1 $ statement_3..
where result_1 = statement_2
これはあなただけv1
引数に、部分的に関数を適用することを可能にするため、共有しますv2
を超える複数の呼び出しのための多くの計算作業、例えばmap (myFunction v1₀) listOfV2s
である。
私は後者が読みやすいと思います。私はまた、即座に理解でき、よく名づけられた機能をもたらすならば、命令言語で*多くの*機能を作ります。しかし、この質問はあまりにも意見に基づいており、良い答えが得られます。 –
'result_i'変数に意味のある名前を割り当てることができれば後者を使います。さもなければ、私は最初のフォームを多分複数の行に使い、しばしば最後のものを除いて '$'の代わりに '.'を使う傾向があります。 – chi
ちょうど意味論的な注記:Haskellには、関数の本体で起こりうるステートメントがなく、式だけがあります。 – chepner