나는 이전의 추출 기능을 MonadTrans
과부하하려고합니다. 나의 현재 시도는 관련 유형 Result
의 인스턴스로 m
내부-모나드를 배치했다 :하스켈의 변수 관련 유형/데이터 유형
class (Monad Result
, MonadTrans m
, MonadReader prefix m
,) => FooReader prefix m where
type Result
runFooReader :: forall b. m b -> prefix -> Result b
instance Monad m => FooReader prefix (ReaderT prefix m)
type Result = m -- This is there the error is thrown
runFooReader = runReaderT
Foo
이 재미있는 모양이다 유일한 이유는 MonadTrans
및 MonadReader
제한 때문이다. 기본적으로 이것은 연관된 모든 유형 인스턴스가 단조 형이되도록합니다 (올바른?).
Result
을 생각
:
...
class FooReader prefix m where
runFooReader :: forall b result. m b -> prefix -> result b
...하지만 그 경우에, 유형 result
및 w
(이 예를 들어, m
로 ReaderT prefix w
인 경우) 은을 통합하지 않습니다. 이걸 만들 수있는 방법이 있습니까 result
varialbe/idea 다형성, 아직 결정할 수 있습니까?
class (Monad Result
, MonadTrans m
, MonadReader prefix m
) => FooReader prefix m where
type Result :: * -> *
runFooReader :: forall b. m b -> prefix -> Result b
instance Monad m => FooReader prefix (ReaderT prefix m) where
type Result = m -- Again, error triggered here
runFooReader = runReaderT
그리고 더 흥미로운 오류 :
The RHS of an associated type declaration mentions type variable `m'
All such variables must be bound on the LHS
이 the GHC docs에 확장됩니다
시도'클래스 FooReader 접두사 m : 여기
컴파일 뭔가 접두사 -> m', mtl과 같은 일을합니다 (그리고 아마 당신이 원하는 것입니다). 만약 내가 올바르게 이해한다면, 당신은 "runStateT','runReaderT','runReaderT '와 같이 행동하는 임의의"모나드 변압기 스택 "과"unwraps "을 취하는 함수"run "을 작성하고 싶습니다. runStateT' 등이 있습니다. 이 작업을 수행하는 일부 코드를 작성한 것을 기억합니다. 작동하지만 형식 오류는 상당 부분 끔찍한 것이 었습니다. 따라서 자주 발생하는 특정 유형의 함수를 정의하는 것만으로도 충분합니다. – user2407038