2012-04-04 22 views
18

私は非常に頻繁に使用する関数を持っています。これは私のコードを私にとって自然な形で書くことを可能にします。ハスケル関数は左から右へ

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

これは私が

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

の代わりに、私は最近、Clojureのは、私は多くのClojureのを知らない(に建てられたこのような何かを持っていることを学んだ

let x = aggregate 
     $ group 
     $ sort 
     $ getData 

ような何かを行うことができますが、私はそれが書かれていると思うでしょう(-> getData sort group aggregate)?)それは私にハスケルもそれが組み込まれているかどうか疑問に思う。 Hoogle doesn't have any resultsです。

似たような標準ライブラリがありますか?このような共通の部分が特有のものであれば、おそらく私のコードを他人に読ませることは難しいでしょう。

+5

私の好みは、OOHaskellごとに '#'この操作を呼び出すことですOCamlではあるいは、F#をコピーして、 '|>' –

+1

Diagramsも#を使うことができます。 – Long

+1

Data.Functionに 'flip($)'を導入する提案がありましたが、初心者などに混乱させるのではなく、そのようなものが有用かどうかについてコンセンサスに達することができなかったため削除されました。ここで議論があります:http://markmail.org/message/vsplpb7aajp7goqo?q=python – David

答えて

22

そこに内蔵され、このようなものは何もありませんが、Control.Category.(>>>)は近いです:それはflip (.)だ、あなたは($:)コンビネータためno shortage of definitions and namesがあります

f = sort >>> group >>> aggregate 

として

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

を書くことができるようにします。私は関数が単純なアプリケーションよりもパイプラインスタイルにしばしば適していると思うので、私はそれを大いに必要としません。しかし、(>>>)は少し醜いです。

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

+2

醜いかどうか私は、(>>>)は、同様の左から右のパイプラインである(>> =)のように見えるので直感的だと思います。 – amindfv

+0

これは 'flip($)'の代わりに 'flip(。)'です。しかし、私は ''>' 'あなたが得ることができるほど近いと思います。 – Xodarap

+0

http://hackage.haskell.org/packages/archive/diagrams-lib/0.4.0.1/doc/html/Diagrams-Util.htmlの(#)もありますが、($) )。 – mgsloan

3

あなたが記述されているリバースアプリケーションオペレータは今& operatorとして4.8.0以降の標準パッケージbase()の一部です。

この演算子は、提案した演算子(infixl 1)よりも低い優先度で定義されています。

1

この正確な要求のために、Taylor Fausakによって作成された、Hackageで利用可能なFlow(https://hackage.haskell.org/package/flow-1.0.10/docs/Flow.html)というライブラリがあります。

これは、|>演算子(F#から触発されています)をスレッド最後に使用します。例えばのために

:それはオブジェクトに対してメソッドの選択と基本的に同じ操作であり、 `#は`このために使用される演算子であるため、

3 |> succ |> recip |> negate 
-0.25 
関連する問題