배경
나는 존 휴즈 'Programming with Arrows을 겪고 있었고, 내가 MAPA 사용하여 다음과 같은 예를 때까지 똑바로 내 머리에 모든 것을 가지고 있다고 생각 :하스켈에서 mapA는 스트림 함수 화살표로 어떻게 작동합니까?
>runSF (mapA (delay 0)) [[1,2,3],[4,5,6],[7,8,9]]
[[0,0,0],[1,2,3],[4,5,6]]
runSF 스트림 기능을 추출 로 정의 StreamFunction 화살표에서 :
newtype SF a b = SF {runSF :: [a]->[b]}
지연과 같이 정의된다
delay x = SF (init . (x:))
SF는 (mapA를 선언하는) ArrowChoice의 인스턴스이며 따라서 Arrow의 인스턴스입니다.
delay
단순히 첫 번째와 두 번째 인자를 앞에 추가
mapA :: arr a b -> arr [a] [b]
delay :: SF a b
있도록 내 이해.
따라서, mapA (delay 0)
은 우리에게 [[b]]
mapA (delay 0) :: SF [[a]] [[b]]
나는이 초래하는 "회로"이라고 기대를 [[a]]
를 받아 반환하는 SF 화살표를 반환해야합니다 :
숫자가 프로세스의 일부에 레이블을 붙이는 곳 :
- 비어 있지 않은 경우
list x
,listcase
은Right(x, xs)
을 방출합니다. 빈 목록의 경우listcase
은 터미널 케이스 인Left()
을 방출합니다. - 값이
Right
인 태그는 하위 부분으로 전달됩니다.Left
태그가 지정된 값은const[]
으로 전달되며, 이는 본질적으로 반복을 중지합니다. - 입력이
(x, xs)
인 경우x
은(delay 0)
으로 전달되고xs
은listcase
으로 다시 전달됩니다. - 3의 출력은
(z, zs)
이 될 것이고, 이는uncurry (:)
으로 전달되며, 튜플을 다시 목록에 조인합니다. 아래 부분 (delay 0)
에 전달Right ([1,2,3],[[4,5,6],[7,8,9]])
([1,2,3], [[4,5,6],[7,8,9]])
가져가 호출됩니다첫 번째 패스 :
여기에 입력
[[1,2,3],[4,5,6],[7,8,9]]
으로, 흐름에 대한 이해의[1,2,3]
, res ulting in[0,1,2]
.[[4,5,6],[7,8,9]]
는[0,4,5]
결과[4,5,6]
에서 호출 하부(delay 0)
에 전달되는listcase
번째 패스
Right ([4,5,6], [[7,8,9]])
([4,5,6], [[7,8,9]])
로 다시 전달된다.[[7,8,9]]
는[0,7,8]
결과[7,8,9]
에서 호출 하부(delay 0)
에 전달되는listcase
번째 패스
Right ([7,8,9], [])
([7,8,9], [])
로 다시 전달된다.[]
은listcase
으로 다시 전달됩니다.Left()
네 번째는, 바닥에 떨어 뜨렸다. 이 시점에서
, 우리는 (3)의 출력을 소요하고 모두 함께 concats 제 4 부에 도착. 우리는 본질적으로의 동작의 구축 :
[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