나는 통해 실행하고있어 이 동시성을 구현하는 가이드와 나는 문제가이 모나드 인스턴스를 이해하는 데 문제가 있습니다 :
data Action m = Atom (m (Action m)) | Fork (Action m) (Action m) | Stop
newtype C m a = C {apply :: (a -> Action m) -> Action m}
instance Monad (C m ) where
m >>= f = C $ \k -> apply m(\a -> apply (f a) k) --?
return x = C $ \k -> k x
연속 모나드의 기본적인 사용을 이해하지만이 선언에서 무슨 일이 일어나고 있는지 해독하는 데 어려움을 겪고 있습니까?
a C m a
는 연속 전달 스타일 Action m
로 a
표현 된 추상 유형에 대한 계산 일 뿐이 (a -> Action m) -> Action m
므로 데이터 생성자 C
와 해당 레코드 선택기 apply
는 구문 론적 플러 프일뿐입니다. 그것들없이 그리고 명시적인 모나드 인스턴스없이 재 작성하면 다음과 같은 동등한 코드를 얻게됩니다. ( Cnt
여기에 있는 유형 은 연속 모나드 가 아니라 연속 일뿐 입니다. 연속 모나드 Control.Monad.Trans.Cont
는 내 CPS
유형 과 더 비슷 합니다.)
type Cnt m a = (a -> Action m) -- a continuation, not a Cont monad
type CPS m a = Cnt m a -> Action m
bind :: CPS m a -> (a -> CPS m b) -> CPS m b
cps_a `bind` a_to_cps_b = \cont_b -> cps_a (\a -> a_to_cps_b a cont_b)
또는 약간 더 자세한 정보 :
cps_a `bind` a_to_cps_b =
\cont_b -> cps_a (\a -> let cps_b = a_to_cps_b a in cps_b cont_b)
어떻게 작동합니까? 글쎄요, 괄호 안의 부분 cont_b
은 b
-continuation 인 자유 변수 를 가지고 있습니다. 그러나이 continuation이 주어지면 free continuation에 적용되는 -computation (CPS 스타일) 을 구성하는 a
데 사용 되는 -continuation 일뿐입니다 . 간단히 말해서, 괄호 안의 부분 은- 연속으로 감싸 진 제공된 부분입니다 . 와 결합하기 위해 , 우리는 단지 적용 이에 -continuation, 그것은의 조합 대표 에 의해 표현 -computation 지도에 낳는 것을 -computation는 모두 무료 변수 CPS 표현을 . 이 자유 변수를 추상화하면a_to_cps_b
b
cont_b
a_to_cps_b
a
cps_a
cps_a
a
a
cps_a
a_to_cps_b
b
b_cont
CPS m b
우리가 필요합니다.
내가 생각하는 그 힘의 도움 이해하기가 모든 것을 쉽게, 당신은 지금이 인식, 원래의 정의로 돌아갈 수 있습니다 \a -> apply (f a) k
정말이다 a
의 -continuation 버전 f :: a -> C m b
무료 변수로 표현 k
나타내는 b
-continuation합니다. apply m
적용 할 수 있습니다 a
-computation을 m
이에 a
-continuation, 우리는 수확기가 뭔가 남아있는 a
-computation m
지도와 f
에서 a
A와 b
, 모든 자유의 표현 -computation b
-continuation라는 k
, 람다하는 우리가 할 수있는 b
-abstract는 bind 연산자가 반환해야하는- 필요한 계산 을 구성합니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다