2016-04-07 14 views
3

モナドを使用してアプリケーションとファンクタを使用するときにコードが似ているので、>>=の代わりに=<<を使用しています。私も*>/>>の代わりに<*を使っています。しかし、私は、<**>でないことに気付きました。何が=<<にありますか?>>=です。例えばhaskellの>>演算子の逆数

print 5 <* print 6 

は私を与える:

私は呼ばれて print 6で、周りに他の方法を印刷するためにそれらを期待していた
5 
6 

、6を印刷した後、その結果()を取得投げ捨ててprint 5と呼んでください。

<**>のように再生した後は、戻り値のみが異なるように見えますが、機能がどのように組み合わされているかといったようなものではありません。一方、=<<は、>>=の適切なフリップであり、左から右に固定されたスイッチを含む。

このケースだった、なぜ私は思っていた(>>=が後方にあるが、それは何らかの形で>>=<*>の型シグネチャが反転しているにもかかわらず、ではない後方、<*><**>組み合わせ、とのより良いフィットのように思えます)。また、私が使うことができる<<スタイルの演算子があるかどうか疑問に思っていました。

=<<の場合、左辺と右辺の組み合わせは違いがありますが、括弧をどこに置いても同じように見えますが、公平にテストしただけですが簡単な例。

+0

可能な複製:http://stackoverflow.com/questions/14176667/why-is-there-no-in-the-haskell-standard-library –

答えて

2

アイ、*>および<*の戻り値が異なるだけです。 >>=<*>の型シグネチャは、私が>>=<*>の署名がある言わないだろう

反転しているにもかかわらず

それは何らかの形ではなく、後方とのより良いフィットし、<*><**>組み合わせ、フリップされたむしろ<*>はちょうどその左の引数に関数を含むように特化されており、右の引数の値にはappliedが入ります。 ++の裏返しバージョンの必要がないようにあなたは、あまりにも>>=でこれを行う

fs<*>xs ≡ fs >>= \f -> f<$>xs 

を考慮することができる私は、<<の応用的等価のための多くの必要はないと思う。ただ*>の引数を注文しますまたは<*の順序で必要なセマンティクスが必要です。

はそれが=<<に来るときも、違いを作る右結合性対左ん、それはあなたが括弧を置くどんなにかのように思われるが、結果は同じ

のErである、それは正しくありません。右の括弧が付いたバージョンは、よくタイプされていません。おそらくあなたはラムダでいくつかの例を試してきましたが、これらをあなたの括約句に考慮しなかったでしょうか?

+0

"引数の順序は' *> 'または' <* 'あなたが望むセマンティクスのために必要な順序で! '= <<' and '>> ='の必要性について同じことは言えませんでしたか?また、私は '純粋な= <<純粋な=純粋な純粋な純粋な<<純粋な純粋な純粋な純粋な5純粋な=純粋な=純粋な=純粋な=純粋な= 5。 – semicolon

+0

関数の引数を持つインコンックスコンビネータの場合、ラムダ(自然な左から右の方向を与える)またはポイントフリーのコンポジションチェーン(右から左)でよく使われると考える必要があります。明確な利益です。しかし、それは '*'のためのものではないので、 '*>'には関係ありません。 - Rg。連想性、注意:関数のモナドインスタンスが存在するため、右括弧で囲まれた式だけが可能です。純粋なものは別のモナドに住んでいます! – leftaroundabout

+0

いずれかの方向が機能する場合は、両方の演算子を使用してください。また、Haskellは一般的に、より機能的な言語であり、 '$' 'と単純に' 'で、より左に移動しません。モナドがすべてをどのようにフリップさせるのか私には奇妙に思えますが、 'print = << (++) <$> getLine <*> getLine'は最初のgetLineを最初に評価しますが、一連の' = << 'は評価されます右から左へ – semicolon

関連する問題