가 나는 동안, 지정된 스택의 상단과 하단으로, 모나드 변압기 스택을 받아들이는 기능을 만들려고하고있는 다음 코드임의 모나드 변압기 스택
본질적으로import Control.Monad.Trans
import Control.Monad.Trans.Except
import Control.Monad.Trans.State
newtype MyTransT m a = MyTransT (m a)
foo :: (MonadTrans t, Monad (t (Either e))) => MyTransT (t (Either e)) a -> a
foo = undefined
bar :: MyTransT (StateT Int (Either e)) a
bar = undefined
baz :: MyTransT (StateT Int (StateT Int (Either e))) a
baz = undefined
x = foo bar -- works
y = foo baz -- doesn't work
을 고려 중간은 뭐든지 될 수 있습니다.
foo baz
이 Couldn't match type ‘StateT Int (Either e1)’ with ‘Either e0’
으로 거부되는 이유에 관해서는 잠시 동안 내 머리를 긁적 후, 마침내 그 경우에, 나는 t
가이 제대로 입력하지 만이 아닌 MonadTrans
하지 않은 StateT Int (StateT Int)
것을 가정 것을 나에게 발생/kinded.
내가하려는 일을 수행 할 방법이 있습니까? 아니면 다른 접근 방식을 시도 할 시간입니까?
'foo'가 실제로 어떻게 작동하는지 몇 가지 구체적인 예를 들려 줄 수 있습니까? – ErikR
타입이'T' 인 것을 상상해보십시오.이 타입은'K' 타입의 키를 가진'V' 타입의 컨테이너로 생각할 수 있습니다. 이제 각각의 'V'도이 패턴을 따른다고 상상해보십시오. 나는'foo :: StateT V (t (어느 쪽인가)) a -> StateT T (ReaderT K (t (어느 쪽인가))) a'를 원합니다. 이렇게하면'V '에 대한 상태 저장 작업을 수행하고'K '환경이있는'T'에 대한 상태 저장 작업으로 들어갈 수 있습니다. 기본적으로 기존의 코드를 변경하지 않고도 무한히 위쪽과 아래쪽으로 확장 할 수있는 트리 구조입니다. – user2085282
구체적인 예가 더 도움이 될 것입니다. 질문을 쉽게 읽을 수있는 곳으로 자유롭게 넣으십시오. – ErikR