2016-10-20 4 views
3

は考えてみましょう:関数内の文の書式設定 - ルール?

myFunction :: (Eq a) => a -> a -> [a] 
myFunction v1 v2 = statement_1.. $ statement_2... $ statement_3... 

myFunction :: (Eq a) => a -> a -> [a] 
myFunction v1 v2 = statement_1 result_1 result_2 
    where 
     result_2 = statement_2 
     result_3 = statement_3 

対どの形式がHaskellで好まれているように親指のルールはありますか?各バージョンの使用時期に関する具体的なルールはありますか?

+0

私は後者が読みやすいと思います。私はまた、即座に理解でき、よく名づけられた機能をもたらすならば、命令言語で*多くの*機能を作ります。しかし、この質問はあまりにも意見に基づいており、良い答えが得られます。 –

+0

'result_i'変数に意味のある名前を割り当てることができれば後者を使います。さもなければ、私は最初のフォームを多分複数の行に使い、しばしば最後のものを除いて '$'の代わりに '.'を使う傾向があります。 – chi

+0

ちょうど意味論的な注記:Haskellには、関数の本体で起こりうるステートメントがなく、式だけがあります。 – chepner

答えて

3

まず、これらは実際には同等ではありません。 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_1v2に依存しない長い計算である場合、それはそれをこのように書くことは理にかなって:

myFunction v1 = \v2 -> statement_1 result_1 $ statement_3.. 
where result_1 = statement_2 

これはあなただけv1引数に、部分的に関数を適用することを可能にするため、共有しますv2を超える複数の呼び出しのための多くの計算作業、例えばmap (myFunction v1₀) listOfV2sである。

関連する問題