2011-12-28 48 views
4

在这本书中符号“功能编程的工艺”“>。>”连接功能结合在一起,方向相反的方向“”。但是当我使用ghci实现它时,它显示错误'>。>'超出了范围。为什么?这是一个旧的记号,不再使用吗?的Haskell>符号

回答

6

这可能只是经书定义的函数(我没读过书)。 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 
+0

感谢您给我们简单明确的答案。但是我只是不明白,书中有这样的记号,它没有在书中定义它,它使用它就像一个标准的符号。该>>甚至在书的索引,并在所有不同的Haskell运营商的图形....... – HHC 2011-12-28 12:42:23

+2

@HHC:我不知道。你要问笔者... – kennytm 2011-12-28 13:54:39

7

>.>没有默认定义,但你可以自己定义:(我给基于Preludeinfixr 9 .固定性声明)

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

或者等价地,

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

+0

此外,还可以当然,总自己定义这样一个操作符:

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

然后就可以写'(F>>克)X =克(FX)'或'(>>)FGX = G(FX)' – 2011-12-28 20:40:41

3

(>.>)不会出现在标准库中定义。然而,在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这些事情弄清楚。也直接

Main*> ((* 2) >.> (+ 3)) 5 
13 
+2

[Hoogle不是寻找>>>使用功能实例化非常有帮助的(http://www.haskell.org/hoogle/?hoogle=%28a+-%3E+b %29 + - %3E +%28b + - %3E + c%29 + - %3E +%28a + - %3E + c%29):( – 2011-12-28 20:42:54