2011-12-28 84 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