在书籍《函数式编程的艺术》中,符号 '>.>' 用于将函数组合起来,方向与 '.' 相反。但是当我在 ghci 中实现时,出现了“>.>”未定义的错误。这是为什么?它是一种已经不再使用的旧符号吗?
>.>
默认情况下未定义,但您可以自己定义:
infixl 9 >.>
(>.>) = flip (.)
infixl 9 >.>
f >.> g = g . f
infixr 9 .
声明修复。这很可能只是书中定义的一个函数(我没有读这本书)。据我所知,在任何地方都没有使用>.>
。你可以自己定义它:
(>.>) = 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
(>.>)
在标准库中似乎没有定义。不过,在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
(>.>) :: (a -> b) -> (b -> c) -> (a -> c)
f >.> g = g . f
Main*> ((* 2) >.> (+ 3)) 5
13
(f >.> g) x = g (f x)
或者(>.>) f g x = g (f x)
。 - Dan Burton