背景
我已經經歷約翰·休斯Programming with Arrows,我覺得我的一切直在我的頭上,直到使用地圖的下面的例子:mapA如何在Haskell中使用流函數箭頭?
>runSF (mapA (delay 0)) [[1,2,3],[4,5,6],[7,8,9]]
[[0,0,0],[1,2,3],[4,5,6]]
凡runSF提取流功能從定義爲流函數箭頭:
newtype SF a b = SF {runSF :: [a]->[b]}
而延遲定義爲:
delay x = SF (init . (x:))
SF是ArrowChoice(它聲明mapA)的一個實例,因此也是Arrow的一個實例。
我的理解
mapA :: arr a b -> arr [a] [b]
delay :: SF a b
這樣delay
只需預先考慮與它的第一個第二個參數。
因此,mapA (delay 0)
應該回到我們的SF的箭頭,需要[[a]]
並返回[[b]]
mapA (delay 0) :: SF [[a]] [[b]]
我會想到的是, 「電路」,這將導致是:
凡過程號碼標籤部分:
- 對於任何非空
list x
,listcase
將發出Right(x, xs)
。對於空列表,listcase
將發出Left()
,終端情況。 - 標記爲
Right
的值將傳遞到較低部分。標記爲Left
的值將被傳遞給const[]
,這基本上會停止迭代。 - 隨着輸入
(x, xs)
,x
將傳遞到(delay 0)
,而xs
將通過回傳到listcase
。 - 3的輸出將會是
(z, zs)
,它會傳遞給uncurry (:)
,它將元組連接回列表中。
這是我流的理解,與輸入[[1,2,3],[4,5,6],[7,8,9]]
:
第一遍
Right ([1,2,3],[[4,5,6],[7,8,9]])
([1,2,3], [[4,5,6],[7,8,9]])
被傳遞至下部(delay 0)
被稱爲上[1,2,3]
,res在[0,1,2]
。[[4,5,6],[7,8,9]]
被傳遞迴listcase
第二通
Right ([4,5,6], [[7,8,9]])
([4,5,6], [[7,8,9]])
被傳遞給下部(delay 0)
上調用[4,5,6]
,導致[0,4,5]
。[[7,8,9]]
被傳遞迴listcase
第三通
Right ([7,8,9], [])
([7,8,9], [])
被傳遞給下部(delay 0)
上調用[7,8,9]
,導致[0,7,8]
。[]
傳回listcase
。
第四通
Left()
,掉在地上。
在這一點上,我們得到的第4部分,這需要3個輸出和concats它一起。我們主要打造的操作:
[0,1,2] : [[0,4,5] : [[0,7,8] : []]]
這將使我們[[0,1,2],[0,4,5],[0,7,8]]
。
我的困惑
顯然,我上面的流程是錯誤的。
如何調用runSF (mapA (delay 0)) [[1,2,3],[4,5,6],[7,8,9]]
結果[[0,0,0],[1,2,3],[4,5,6]]
?
那麼,顯然我的理解是關閉的,因爲延遲的類型是SF。本身不是一個函數。 – aftertommy