2011-12-23 7 views
16

ハスケルでは、私は$を使って式を書くことがよくあります。私はそれが非常に自然で読みやすいと思っていますが、時にはそれが悪い形であり、それがなぜ必要なのか理解していません。

+7

悪いフォームとして記載されている場所の参照はありますか? – bobbymcr

+0

短い答え:いいえ。 –

答えて

22

次は、すべての良いフォームです:

foo = bar . baz . quux 
foo x = bar . baz . quux $ x 
foo x = (bar . baz . quux) x 
foo x = bar (baz (quux x)) 

いつものように変化し味が、状況が異なる選択を要求するかもしれませんが、私は、私の好みの大まかな順序でそれらを入れています。私もたまにbarbazのそれぞれ、およびquux部分式が長い場合

foo = bar 
    . baz 
    . quux 

を見てきました。以下は悪い形式です:

foo x = bar $ baz $ quux $ x 

これはあまり好ましくない理由が2つあります。第1に、リファクタリング中に補助定義にコピーして貼り付けることができるサブ表現を少なくすることができます。 (.)($)事業者とbar . bazまたはbaz . quuxのようにも部分式が別々の定義に引き出すことができるのに対し、すべての($)事業者と、x引数を含めるだけの部分式は、有効なリファクタリングです。

(.)を好む第2の理由は、($)の固定性の可能性のある変更を予期しているためです。現在、($)はそうのように、それは、右に関連付け意味、infixrです:それはinfixlた場合

foo x = bar $ (baz $ (quux $ x)) 

しかし、($)は、以上の式に有用であろう。

foo h = f (g x) (h y) 
foo h = f $ g x $ h y 
foo h = (f $ g x) $ h y 

...現在はカッコなしでは表現できません。 infixlアプリケーションで解析されたときに「悪いフォーム」の例では、大幅に異なるものを意味

foo x = ((bar $ baz) $ quux) $ x 

だろう。したがって、この形式を避けることで、将来的にコードを保護してください。

+6

私は時々 'barのようなものを見たことがあります。 baz $ quux x'や 'bar(baz。quux $ x)'や他の中置演算子が関わっている場合や、特定の関数アプリケーションが概念的に強調されている場合には、 –

+6

IMOでは、コンフィギュラリカルスタイルでパイプラインを簡単な切り取りと貼り付けで関数にリファクタリングすることができるという事実よりも、fixity引数の方が魅力的です。 – ehird

+0

'bar $ baz $ quux $ x'を持っていれば、現在の固定性で' barと同じです。バズ。 quux $ x'である。もちろん後者は前者よりも奨励されています。 –

関連する問題