19

非常に頻繁に使用する関数があります。これにより、より自然に見える方法でコードを記述できます。

infixl 6 $:
($:) :: a -> (a -> b) -> b
a $: f = f a

これにより、次のようなことができます

let x = getData
        $: sort
        $: group
        $: aggregate

それ以外の

let x = aggregate 
        $ group 
        $ sort 
        $ getData

最近、Clojure にこのようなものが組み込まれていることを知りました (Clojure についてはあまり知りませんが、書かれていると思います(-> getData sort group aggregate)か?)。Haskell にも組み込まれているのではないかと思います。ただし、 Hoogleには結果がありません

似たようなものが含まれている標準ライブラリはありますか? そのような共通部分が特異な場合、おそらく他の人が私のコードを読むのが難しくなります。

4

3 に答える 3

22

このようなものは組み込まれていませんが、Control.Category.(>>>)近くにありflip (.)ます。そうなので、次のように書くことができます。

f x = x $: sort $: group $: aggregate

なので

f = sort >>> group >>> aggregate

コンビネータの定義と名前に不足はありません。($:)関数は単純なアプリケーションよりもパイプラインスタイルに適している傾向があると思うので、それに対する大きな必要性は感じません。(>>>)しかし、少し醜いです。

(さらに、Haskellの非厳密なセマンティクスは、データの流れが必ずしも矢印がここで指している方向にあるとは限らないことを意味します。結局のところ、引数を見る機会を得るaggregate前に最初のコンストラクターを提供する可能性があります。とsortを使用するだけです;私は注文に慣れています。)(.)($)

于 2012-04-04T01:32:41.697 に答える
3

あなたが説明しているリバースアプリケーション演算子は、現在、 operatorbaseとして標準パッケージ (4.8.0 以降)の一部です。&

この演算子は、提案したもの ( infixl 1) よりも低い優先順位で定義されていることに注意してください。

于 2016-04-15T14:07:00.687 に答える