2014-04-04 122 views
11

通過閱讀關於Haskell各種以類別爲主題的類的各種教程,我們發現諸如MonoidFunctor,Monad等等 - 所有這些都有幾十個實例。但由於某種原因,當我們到達Arrow時,只有兩個實例:函數和monad。在這兩種情況下,使用Arrow實例都不如直接使用底層事物更強大也更困難。箭頭怎麼樣?

有沒有人有任何有趣箭的例子?我敢肯定,肯定有一些,但我從來沒有遇到任何有關他們的文章...

+0

[相關](http://programmers.stackexchange。com/questions/114681 /這是什麼目的的箭頭) – bheklilr

+0

基於箭頭的玻璃鋼是否符合要求? –

+1

我對Haskell中的箭頭的理解是,它們或多或少地爲您提供了電路的語言,其中一個組件取決於之前的輸出。你可能會問這與正常的函數組合和組合有什麼不同,但是正常的函數不能帶有額外的上下文和結構,而箭頭則更抽象並且可以。這就是爲什麼他們在FRP中非常受歡迎,您可以編寫看起來很純的有效代碼,並且可以非常輕鬆地推理。它們也用於Hxt庫,通過看似純粹的計算來流式傳輸XML數據。 – bheklilr

回答

7

HXT,一個用於解析XML的庫,是一個很好的使用箭頭的例子(有看看這個包的模塊名稱中出現多少次這個詞Arrow!)。你應該看看這個偉大的教程:http://adit.io/posts/2012-04-14-working_with_HTML_in_haskell.html

但是,爲功能提供箭頭概念也是一件好事。例如,下面的代碼

((+1) &&& (*2)) 3 -- result is (4,6) 

只是工作,因爲(->)是箭頭類(操作員&&&Control.Arrow定義)的一個實例。

得益於arrow syntax,您也可以在Haskell中編寫複雜的計算工具(它也適用於HXT中的函數,monads和XML過濾器)。

+0

HXT看起來很有趣。對於爲什麼大多數解析器庫是可用的仿函數(或單子)的任何評論,但這是一個箭頭? – MathematicalOrchid

8

我喜歡將Arrow s看作可組合的有向非循環圖。例如,類型的箭頭:

SomeArrow (a, b, c) (d, e, f) 

......你能想到的爲具有a型,b三個入邊,和cd類型,e三個邊,和f圖。

使用這種解釋,爲Arrow S中的類的操作組合是像圖橫向拼接,其邊緣連接在一起:

(.) :: SomeArrow b c -> SomeArrow a b -> Some Arrow a c 

...其中abc可能是自己的元組。同樣,id僅僅是所有入邊轉發給外出邊緣身份圖:

id :: SomeArrow a a 

的另一個關鍵操作是(***)這就好比圖表的垂直串聯:

(***) :: Arrow a b -> Arrow c d -> Arrow (a, c) (b, d) 

你能想到的,將兩個圖並排放置,組合它們的輸入邊緣和輸出邊緣。

所以Arrow通常出現在使用類型有向無環圖時。然而,你通常看不到它們的原因是因爲大多數人在思維上將圖表與無類型和高性能的數據結構聯繫起來。

+0

假設'ArrowLoop'是圖表停止非循環的點? – MathematicalOrchid

+1

這無意中得到了爲什麼箭頭不是非常有用/流行的核心。我們已經有了用於構成事物的'Category',並且Haskell語言中的聲明本身就是存在於同一時間(彼此相鄰)的事物,因此所有'Arrow'都添加了粘合劑,用於將事物放在一起,並把它們分開。問題是可逆粘合劑只是元組,這是不起作用的。這真是元組的錯。想象一下,如果我們用'f a - > f b - > f(a,b)'替換'Applicative'中的'<*>'。 – Cirdec

+0

@MathematicalOrchid Right –