nền
Tôi đã trải qua John Hughes Programming with Arrows, và tôi cảm thấy rằng tôi đã có tất cả mọi thứ thẳng trong đầu tôi cho đến ví dụ sau sử dụng MAPA:MapA hoạt động như thế nào với một mũi tên chức năng luồng trong Haskell?
>runSF (mapA (delay 0)) [[1,2,3],[4,5,6],[7,8,9]]
[[0,0,0],[1,2,3],[4,5,6]]
đâu runSF chiết xuất chức năng suối từ StreamFunction mũi tên định nghĩa là:
newtype SF a b = SF {runSF :: [a]->[b]}
Và chậm trễ được định nghĩa là:
delay x = SF (init . (x:))
SF là một thể hiện của ArrowChoice (khai báo mapA) và do đó là một thể hiện của Arrow.
Hiểu My
mapA :: arr a b -> arr [a] [b]
delay :: SF a b
mà delay
đơn giản prepends số thứ hai của mình với lần đầu tiên của nó.
Như vậy, mapA (delay 0)
nên trả lại chúng tôi một mũi tên SF mà sẽ đưa [[a]]
và trả [[b]]
mapA (delay 0) :: SF [[a]] [[b]]
Tôi hy vọng rằng các "mạch" rằng điều này sẽ gây ra là:
Trong đó các con số gắn nhãn các phần của quy trình:
- Đối với bất kỳ ô trống nào
list x
,listcase
sẽ phát raRight(x, xs)
. Đối với danh sách trống,listcase
sẽ phát raLeft()
, vỏ thiết bị đầu cuối. - Giá trị được gắn thẻ
Right
sẽ được chuyển đến phần dưới. Giá trị được gắn thẻLeft
sẽ được chuyển đếnconst[]
, về cơ bản dừng lặp lại. - Với đầu vào
(x, xs)
,x
sẽ được chuyển đến(delay 0)
, trong khixs
sẽ được chuyển ngược lại đếnlistcase
. - Kết quả đầu ra của 3 sẽ là
(z, zs)
, được chuyển đếnuncurry (:)
, kết hợp bộ túp trở lại danh sách.
Dưới đây là sự hiểu biết của tôi về dòng chảy, với đầu vào [[1,2,3],[4,5,6],[7,8,9]]
:
Đầu tiên vượt qua
Right ([1,2,3],[[4,5,6],[7,8,9]])
([1,2,3], [[4,5,6],[7,8,9]])
được truyền cho phần dưới(delay 0)
được kêu gọi[1,2,3]
, res ulting in[0,1,2]
.[[4,5,6],[7,8,9]]
được chuyển trở lạilistcase
Thứ hai vượt qua
Right ([4,5,6], [[7,8,9]])
([4,5,6], [[7,8,9]])
được thông qua để phần dưới(delay 0)
được kêu gọi[4,5,6]
, dẫn đến[0,4,5]
.[[7,8,9]]
được chuyển trở lạilistcase
Thứ ba đường chuyền
Right ([7,8,9], [])
([7,8,9], [])
được thông qua để phần dưới(delay 0)
được kêu gọi[7,8,9]
, dẫn đến[0,7,8]
.[]
được trả vềlistcase
.
Thứ tư đường chuyền
Left()
, giảm trên sàn nhà.
Tại thời điểm này, chúng tôi nhận đến phần 4, trong đó có sản lượng 3 và concats nó tất cả cùng nhau. Chúng tôi về cơ bản xây dựng của một hoạt động của:
[0,1,2] : [[0,4,5] : [[0,7,8] : []]]
nào sẽ cung cấp cho chúng tôi [[0,1,2],[0,4,5],[0,7,8]]
.
Lẫn lộn của tôi
Rõ ràng, lưu lượng trên của tôi sai.
Làm thế nào để gọi runSF (mapA (delay 0)) [[1,2,3],[4,5,6],[7,8,9]]
kết quả trong [[0,0,0],[1,2,3],[4,5,6]]
?
Vâng, rõ ràng sự hiểu biết của tôi là tắt vì loại chậm trễ là SF. Không phải là một hàm. – aftertommy