Haskell関数の左から右への質問

Haskell関数の左から右への質問

私には頻繁に使用する関数があり、これを使用すると、より自然な方法でコードを記述できます。

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結果がありませんけれど。

同様のものが含まれている標準ライブラリはありますか? このような共通部分が特異なものである場合、他の人が私のコードを読みにくくする可能性があります。

ベストアンサー1

このような機能は組み込まれていませんが、Control.Category.(>>>)は近いです。つまりflip (.)

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

として

f = sort >>> group >>> aggregate

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

(さらに、Haskell の非厳密なセマンティクスでは、データの流れは必ずしもここで矢印が指している方向とは限らないため、引数を確認するaggregate前に最初のコンストラクタを提供できます。そのため、私は単にと をsort使用する傾向があります。順序に慣れているからです。)(.)($)

おすすめ記事