136

私はRealWorldHaskellを読んでいて、終わりに近づいていますが、スタイルの問題が、(.)および($)演算子との関係で私を悩ませてきました。

他の関数を組み合わせた関数を書くときは、次のように書きます。

f = g . h

しかし、これらの関数の最後に何かを適用すると、次のように記述されます。

k = a $ b $ c $ value

しかし、本はそれを次のように書くでしょう:

k = a . b . c $ value

今、私にはそれらは機能的に同等に見えます、それらは私の目にはまったく同じことをします。しかし、私が見れば見るほど、人々が本のように機能を書いているのを見ることができます:(.)最初に作曲し、最後にのみ($)、ロットを評価するための値を追加するために使用します(多くのドル作曲では誰もそれをしません) 。

($)すべての記号を使用するよりもはるかに優れた本の方法を使用する理由はありますか?それとも、私が得ていないいくつかのベストプラクティスがここにありますか?それとも不要なので、まったく気にする必要はありませんか?

4

7 に答える 7

159

私は権威からこれに答えることができると思います。

すべての($)記号を使用するよりもはるかに優れた本の方法を使用する理由はありますか?

特別な理由はありません。ブライアンと私はどちらもラインノイズを減らすことを好みます。.より静かです$。その結果、本はf . g . h $ x構文を使用します。

于 2010-06-13T01:49:04.947 に答える
55

それらは確かに同等です$。オペレーターは基本的に何もしないことに注意してください。f $ xに評価されf xます。の目的$は、その固定動作です。つまり、右結合で最小限の優先順位です。中置優先順位の代わりにグループ化に括弧を削除$して使用すると、コードスニペットは次のようになります。

k = a (b (c (value)))

k = (a . b . c) value

.バージョンよりもバージョンを優先する$理由は、上記の非常に括弧で囲まれたバージョンよりも両方を優先する理由と同じです。美的魅力です。

ただし、括弧の代わりに中置演算子を使用することが、Lispとの類似性を回避したいという潜在意識の衝動に基づいているのではないかと思う人もいるかもしれません(冗談ですが...私は思いますか?)。

于 2010-06-13T02:08:07.227 に答える
44

に追加しますがf . g $ xf . gこれは意味のある構文単位です。

一方、ではf $ g $ xf $ gは意味のある単位ではありません。のチェーン$は、間違いなくより必須です。最初にの結果を取得しgx次にそれを実行fし、次にそれを実行fooし、次になどです。

一方、チェーン.は間違いなくより宣言的であり、ある意味ではデータフロー中心のビューに近いものです。一連の関数を構成し、最終的にそれらを何かに適用します。

于 2010-06-22T15:06:56.810 に答える
19

私にとって、答えは(a)ドンが言ったようにきちんとしていることだと思います。(b)コードを編集しているときに、関数がポイントフリースタイルになる可能性があることがわかりました。その後、$戻ってすべてを変更するのではなく、最後を削除するだけです。マイナーな点は確かですが、いい点です。

于 2010-06-13T02:45:52.933 に答える
13

このhaskell-cafeスレッドでこの質問について興味深い議論があります。$どうやら、の正しい結合性は「まったく間違っている」という少数派の見方があり、選択f . g . h $ xすることf $ g $ h $ xは問題を回避する1つの方法です。

于 2010-06-13T15:51:15.147 に答える
3

それはただのスタイルの問題です。しかし、その本のやり方は私にはもっと理にかなっています。すべての関数を構成し、それを値に適用します。

あなたの方法は奇妙に見えるだけで、最後$は不要です。

しかし、それは本当に問題ではありません。Haskellには、通常、同じことを行うための多くの正しい方法があります。

于 2010-06-13T01:02:50.053 に答える
0

これは非常に古い質問だと思いますが、言及されていない別の理由があると思います。

新しいポイントフリー関数を宣言する場合f . g . h、渡した値が自動的に適用されます。ただし、と書く f $ g $ hと動作しません。

著者が合成​​法を好む理由は、それが関数を構築する良い習慣につながるからだと思います。

于 2015-09-12T18:26:24.007 に答える