2017-04-15 1 views
16

(<$>)infixl 4の固定性を持っています。どうすればいいの?

(+1) <$> (/5) <$> [5,10]明らかに、右から左に作用します。

答えて

18

いいえ、<$>はアソシエティブであり、これはあなたの例では変わりません。 (+1) <$> (/5) <$> [5,10]((+1) <$> (/5)) <$> [5,10]と読み込まれます。これはFunctorのインスタンスが(->) aであるため機能しますが、基本的には機能の構成と同じです。 fmap (+1) (/5)\x -> (x/5)+1に相当します。この例では、あなたが考えていると思われる注文と同じ結果が得られます。つまり、(+1) <$> ((+5) <$> [5,10])です。

これは少し紛らわしいので、複数の関数を1つの行に適用する場合は、通常の関数合成演算子を使用するのが読みやすくなる可能性があります((+1) . (/5) <$> [5,10])。

+0

セマンティクスに関する限り、それは左か右の結合であるかどうかは重要ではありません(実際にファンクタはファンクタの法則を満たしています)。左の協同性が意図的な選択だったのだろうか?パフォーマンスの理由から。それは偶然によって、あるいは理論的にはエラーによって、そのように定義された可能性さえあります。 – chi

+2

@chi '(<$>)'が右結合であれば、 'f <$> x <*> y'スタイルのパターンを使うことはできません('(<*>) 'も正しい連想でなければならないので、そのような括弧)。あなたは 'f $ gx $ hy'のようなことをすることができ、' f(gx)(hy) 'と同等であることができるので、'($) ' - >'がどのように正しい結合であるかと対称的であると推測します)。もちろん、それは本当に優先されます。 –

+0

@DavidYoungああ、そうです。感謝します、ありがとう。 – chi

関連する問題