【发布时间】:2011-12-28 10:58:03
【问题描述】:
在“函数编程的工艺”一书中,符号“>.>”将函数连接在一起,与“.”的方向相反。但是当我使用 ghci 实现它时,它显示错误 '>.>' 超出范围。为什么?它是不再使用的旧符号吗?
【问题讨论】:
标签: haskell syntax operators notation
在“函数编程的工艺”一书中,符号“>.>”将函数连接在一起,与“.”的方向相反。但是当我使用 ghci 实现它时,它显示错误 '>.>' 超出范围。为什么?它是不再使用的旧符号吗?
【问题讨论】:
标签: haskell syntax operators notation
>.>默认没有定义,你可以自己定义:
infixl 9 >.>
(>.>) = flip (.)
或等价的,
infixl 9 >.>
f >.> g = g . f
(我根据Prelude中的infixr 9 .给出了固定性声明。)
【讨论】:
(f >.> g) x = g (f x) 或(>.>) f g x = g (f x)
可能只是书上定义的一个函数(我没看过书)。 AFAIK,>.> 不在任何地方使用。你可以自己定义:
(>.>) = 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
请注意,您可以使用Hoogle 来解决这些问题。
此外,您当然可以始终自己定义这样的运算符:
(>.>) :: (a -> b) -> (b -> c) -> (a -> c)
f >.> g = g . f
然后你可以写:
Main*> ((* 2) >.> (+ 3)) 5
13