2011-11-03 3 views
6

Control.Applicative에 대한 문서를 살펴보면 특정 모나드 (예 : IO, Maybe, 특히 ST)에 대한 인스턴스 선언이 있음을 알았지 만 StateRWS과 같은 MTL 모나드의 인스턴스는 없습니다. 대신 일반적인 용도의 WrappedMonad 유형이 정의되어있는 것처럼 보입니다.이 유형은 다른 모든 경우를 처리하는 것으로 추측됩니다.주 및 다른 MTL 모나드의 적용 인스턴스?

그럼 내 질문은 다음과 같습니다.

  1. 왜 MTL 모나드에 Applicative 인스턴스가 없습니까? 내가 지금까지 스스로 찾아 낼 수 있었던 가장 좋은 대답은 three year old post으로 누군가이 인스턴스를 구현하고 간략하게 무시되었다.

  2. WrappedMonad와 어떤 관계가 있습니까? post on Reddit가 짧게 설명되어 있지만 사용법에 대해 혼란 스럽다고 생각합니다.

궁극적으로 응용 스타일 (recommended to me)에서 State을 사용할 수 있기를 바랍니다.하지만 WrappedMonad 데이터 생성자로 코드를 깔아야한다면 성공하지 못했습니다. . 또한 WrappedMonad를 완전히 무시하고 Applicative 인스턴스를 IO, ST 등의 작업과 동일한 방식으로 정의 할 수 있습니다. returnap의 측면에서 ...하지만 이는 구피처럼 보입니다.

+0

Functor => 적용 => Monad 및 (Alternative, Monad) => MonadPlus – alternative

답변

8

해당 설명서는 을 포함하지 않는 base 패키지의 내용만을 기반으로 생성되므로 Applicative 인스턴스가 포함되어 있지 않습니다. the MTL documentation을 보면 Applicative 인스턴스가 표시됩니다.

다른 방법으로, 당신은 State을위한 형의 별명입니다 (GHCi, 수입 Control.Monad.State 및 Control.Applicative을 열고 StateT는 인스턴스가있는 클래스를 나열 Applicative 또는 :i StateT의 인스턴스를 나열하는 :i Applicative을 사용할 수 있습니다 StateT의 매개 변수 중 하나가 고정되어 있음). 어느 것이 든 실제로 그런 경우가 있음을 보여줄 것입니다.

+0

분명히 나는 ​​박쥐로 눈이 멀었습니다. 그 정확한 문서를보고 있었고'Applicative' 인스턴스를 보지 못했습니다. – mergeconflict

2

mtl 모나드의 Applicative 인스턴스는 기본 문서에 나열 할 수 없습니다. 그 시점에서 사용할 수있는 mtl이 없기 때문입니다. 좋은 소식은 mtl에 mtl-2.0.0.0 이후 Applicative 인스턴스 StateT for example이 있다는 것입니다.

관련 문제