4

「The Craft of Function Programming」という本では、記号 '>.>' は関数を結合し、'.' の方向とは逆になっています。しかし、ghci を使用して実装すると、エラー '>.>' が範囲外に表示されます。なんで?もう使われていない古い表記ですか?

4

3 に答える 3

7

>.>デフォルトでは定義されていませんが、自分で定義できます。

infixl 9  >.>
(>.>) = flip (.)

または同等に、

infixl 9  >.>
f >.> g = g . f

( Preludeinfixr 9 .のに基づいて固定宣言を行いました。)

于 2011-12-28T11:14:58.350 に答える
6

それはおそらく本で定義された単なる関数です(私は本を読んでいませんでした)。私の知る限り、>.>どこでも使用されていません。自分で定義できます:

(>.>) = flip (.)

これの事実上の表記は のよう(#)です。

関数は矢印 「Control.Category」も使用できます>>>

Prelude Control.Category> ((*2) . (+1)) 4
10
Prelude Control.Category> ((*2) <<< (+1)) 4
10
Prelude Control.Category> ((*2) >>> (+1)) 4
9
Prelude Control.Category> ((+1) >>> (*2)) 4
10
于 2011-12-28T11:16:12.687 に答える
3

(>.>)標準ライブラリでは定義されていないようです。ただし、同じように動作する(>>>)inがあります。Control.Category

Prelude> :m + Control.Category
Prelude Control.Category> :i (>>>)
(>>>) :: Category cat => cat a b -> cat b c -> cat a c
    -- Defined in Control.Category
infixr 1 >>>
Prelude Control.Category> let f = (* 2) >>> (+ 3)
Prelude Control.Category> f 5
13

Hoogleを使用して、これらのことを把握できることに注意してください。

さらに、もちろん、いつでもそのような演算子を自分で定義できます。

(>.>) :: (a -> b) -> (b -> c) -> (a -> c)
f >.> g = g . f

次に、次のように記述できます。

Main*> ((* 2) >.> (+ 3)) 5
13
于 2011-12-28T11:19:07.927 に答える