2011-01-27 41 views
1

一些使用箭頭的函數在成對使用時非常方便。但我不明白這些功能的類型是如何與一對相結合的。一般來說,我發現箭頭相關函數的類型相當混亂。一對如何與箭頭函數的類型相結合

例如,我們有first :: a b c -> a (b, d) (c, d),這對我來說意義不大。但它可以被用來,比如說,增加一對的第一個數字:

Prelude Control.Arrow> :t first (+1) 
first (+1) :: (Num b) => (b, d) -> (b, d) 

而且

Prelude Control.Arrow> :t (&&&) 
(&&&) :: (Arrow a) => a b c -> a b c' -> a b (c, c') 

Prelude Control.Arrow> :t (pred &&& succ) 
(pred &&& succ) :: (Enum b) => b -> (b, b) 

可能有人請解釋這是如何工作的?

回答

2

沒有爲Arrow (->)一個實例。所以

(&&&) :: (Arrow a) => a b c -> a b c' -> a b (c,c') 

有實例

(&&&) :: (->) b c -> (->) b c' -> (->) b (c,c') 

,或者寫在更傳統的符號,

(&&&) :: (b -> c) -> (b -> c') -> (b -> (c,c')) 

其餘部分應該從下面。

我用的(->)實例箭頭的功能(尤其是(***)(&&&)所有的時間。我使用這些組合器的任何其他實例Arrow是非常罕見的。因此,無論何時看到a b c,請將「(廣義)函數從b」設置爲c「,這也適用於常規函數。

2

第一箭頭需要正常箭頭,並且改變它在一個元組的第一個元素上執行其操作,並輸出結果作爲箭頭

a b c -> a (b, d) (c, d) 

a b c -- is the input arrow, an operation that maps type b to c 
a (b, d) (c, d) -- is the output arrow, an operation that maps a tuple (b, d) to (c, d) 

它使用d作爲未知第二虛設在元組

& & &類型採用兩個箭頭的是採取同樣的輸入,並創建一個箭頭,取該輸入,複製成一個元組,並運行在所述元組的每個部分中的箭頭中的一個,並返回所改變的元組。

一些固體教程,請上網: http://www.vex.net/~trebla/haskell/hxt-arrow/lesson-0.xhtml

相關問題