Haskell 関数合成 (.) および関数適用 ($) のイディオム:正しい使い方
-
26-09-2019 - |
質問
読んでいます 現実世界のハスケル, で、終わりに近づいていますが、スタイルの問題が私を悩ませています。 (.)
そして ($)
オペレーター。
他の関数を組み合わせた関数を記述する場合は、次のように記述します。
f = g . h
しかし、これらの関数の最後に何かを適用するときは、次のように書きます。
k = a $ b $ c $ value
しかし、本では次のように書かれています。
k = a . b . c $ value
さて、私にとってそれらは機能的に同等に見えますが、私の目にはまったく同じことを行います。しかし、調べれば見るほど、この本に書かれている方法で関数を書いている人が増えています。と作曲する (.)
最初に使用し、その後は最後にのみ使用します ($)
ロットを評価するための値を追加します (多くのドル構成では誰もそれを行いません)。
書籍をすべて使用するよりもはるかに優れた方法で使用する理由はありますか? ($)
シンボル?それとも、私が得ていないベストプラクティスがここにあるのでしょうか?それとも余計なことなので、まったく気にしなくてもいいのでしょうか?
解決
私は当局からこれを答えることができると思います。
はるかに優れて使用するよりも図書の方法を使用する理由はあり、全て($)記号?
特別な理由はありません。ブライアンと私の両方がラインノイズを低減することを好みます。 .
は$
よりも静かです。その結果、本はf . g . h $ x
構文を使用します。
他のヒント
彼らは確かに等価です:基本的に、何も、$
事業者が行うことを覚えておいてください。 f $ x
はf x
に評価されます。右結合し、最小限の優先順位:$
の目的は、その固定性の動作です。
$
を削除し、代わりに中置の優先順位をグループ化するために、括弧を使用して、コードスニペットは、次のようになり
k = a (b (c (value)))
と
k = (a . b . c) value
.
バージョン上$
バージョンを好む理由は、上記の非常に括弧バージョン上の両方を好むため、同じ理由である:。美的アピール
が、中置演算子の代わりに、括弧を使用している場合、いくつかのかもしれないの不思議は、Lispのにすべての可能な類似(冗談を...と思う?)を回避するために、いくつかの潜在意識の衝動に基づいています。
私はf . g $ x
で、f . g
は意味のある構文単位であることを付け加えたいです。
一方、f $ g $ x
に、f $ g
は意味単位ではありません。 $
のチェーンは間違いなく、より不可欠である - の最初のの後、はそれにg
を行うの、x
のf
の結果を取得するには、が、その後のにfoo
を行いますそれ、の後、のその他
一方.
のチェーンは間違いなくより宣言であり、いくつかの意味で近いデータフロー中心のビューへ - 一連の機能を構成し、そして最終的に何かに適用します。
私にとって、答えは (a) きちんとしていることだと思います。 ドンは言いました;(b) コードを編集しているときに、関数がポイントフリー スタイルになってしまう可能性があることに気づきました。その場合は、最後の関数を削除するだけで済みます。 $
元に戻ってすべてを変えるのではなく。確かに些細な点ですが、素晴らしい点です。
このHaskellのカフェで、この質問の興味深い議論がありますのスレッド。どうやら$
の右の結合規則は、「であることを保持している少数民族の視点があります単純に間違っ」に、そしてf . g . h $ x
上f $ g $ h $ x
を選択すると、この問題は、サイドステップの一つの方法です。
これはスタイルの問題です。しかし、この本が行う方法は、それは私に多くの意味があります。これは、すべての機能を構成し、その値に適用します。
あなたの方法は、単に奇妙に見える、そして最後$
は不要です。
しかし、それは本当に問題ではありません。 Haskellでは、同じことを行うには通常、多くの、多くの、正しい方法があります。
私はこれは非常に古い問題であると認識が、私は言及されていない。このため、別の理由があると思います。
あなたは新しいポイントフリー機能のf . g . h
を宣言している場合は、は、あなたが渡す値が自動的に適用されます。しかし、あなたがf $ g $ h
を書いた場合、それはないでしょう仕事ます。
私はそれが機能を構築するのは良い習慣につながるため、著者は、合成方法を好む理由があると思います。