2014-04-11 3 views
33

MonadPlus 뒤에있는 동기를 이해하려고합니다. 이미 보조 안경 MonadMonoid이있는 것이 필요한 이유는 무엇입니까?왜 MonadPlus가 아닌 Monad + Monoid입니까?

허용되는 경우 Monoid의 인스턴스는 구체 유형이고 Monad의 인스턴스는 단일 유형 매개 변수를 필요로합니다. (. 도움이되는 설명을 Monoid vs MonadPlus 참조)하지만 당신은 MonadMonoid의 조합으로

(MonadPlus m) => ... 

모든 유형의 제약 조건을 다시 쓰지 수 있을까?

(Monad m, Monoid (m a)) => ... 

예컨대, Control.Monad에서 guard 기능을 가지고. 그것의 구현은 다음과 같습니다

guard' :: (Monad m, Monoid (m())) => Bool -> m() 
guard' True = return() 
guard' False = mempty 

사람이 MonadPlusMonad + Monoid 사이의 진정한 차이를 명확히 주 시겠어요 : 나는 그것을 구현할 수 있었다

guard :: (MonadPlus m) => Bool -> m() 
guard True = return() 
guard False = mzero 

MonadMonoid 사용하고 계십니까?

답변

32

하지만 당신은 모나드와 모노 이드의 조합으로

(MonadPlus m) => ... 

모든 유형의 제약 조건을 다시 쓰지 수 있을까?

아니요. 링크 된 질문에 대한 가장 먼저 대답은 MonadPlus vs. Monoid의 법칙에 대한 좋은 설명입니다. 그러나 우리가 typeclass 법칙을 무시하더라도 차이가 있습니다.

Monoid (m a) => ...m a은 호출자에 의해 선택된 특정한 a하는 모노 이드되어야한다는 것을 의미하지만 MonadPlus mm a 모든 a하는 모노 이드되어야한다는 것을 의미한다. 그래서 MonadPlus a보다 유연하고, 이러한 유연성은 네 가지 상황에서 도움이 될 것입니다 :

  1. 우리가 사용하려는 어떤 a 발신자에게하지 않으려면. 대신

  2. 우리가 a 서로 다른 여러 개의 사용할 경우 Monoid (m SecretType) => ...
    MonadPlus m => .... 대신 우리는 무한히 많은 다른 a을 사용하려면 (Monoid (m Type1), Monoid (m Type2), ...) => ...


  3. MonadPlus m => ....
    MonadPlus m => ... 대신 가능하지 않습니다.

  4. a이 필요한 경우. MonadPlus m => ... 대신 가능합니다.

+0

괜찮 으면 여기에서 구체적인 예를보고 싶습니다. MonadPlus가 Monoid보다 더 유용하거나 더 깨끗한 특정 Monads를 사용하여 몇 가지 인스턴스를 제공 할 수 있습니까? – Fresheyeball

+0

@Fresheyeball : 아니요, "특정 모나드를 사용하는 일부 인스턴스"를 제공 할 수 없습니다. 죄송합니다. 모나드가 알려졌다면 m을 추상화 할 필요가 없으며 m 클래스의 예상 인터페이스를 지정하기 위해 유형 클래스를 사용할 필요가 없으므로 'MonadPlus'와'Monoid'의 차이는 코드가 특정 모나드에서만 작동합니다. – Toxaris

+0

그 점을 이해합니다. 그러나 특정 모나드가 일반화 된 코드로 어떻게 작동 하는지를 보지 않고 연습을 개념화하기는 어렵다. – Fresheyeball

6

guard'이 (가) Monoid m a 유형과 일치하지 않습니다.

Monoid (m a)을 의미하는 경우 에 대해 mempty을 정의해야합니다. 이 작업을 완료하면 MonadPlus을 정의했습니다. mzeromplus에 대해 중성이고, mplus는 연관성 두 가지 규칙을 만족하고 mzeromplus : 환언

MonadPlus 두 opeartions을 정의한다. 이것은 Monoid의 정의를 만족하므로 mzeromempty이고 mplusmappend입니다.

차는 MonadPlus m 어떤 a하는 모노 이드 m a 것이 있지만 Monoid mm하는 모노 이드를 정의한다. guard'은 의 경우에만 이되어야 m 만 필요했기 때문에 작동합니다. 그러나 MonadPlus이 더 강한 경우 m a은 어떤 a에 대해서도 단조로 주장합니다.

관련 문제