MonadPlus
뒤에있는 동기를 이해하려고합니다. 이미 보조 안경 Monad
및 Monoid
이있는 것이 필요한 이유는 무엇입니까?왜 MonadPlus가 아닌 Monad + Monoid입니까?
허용되는 경우 Monoid
의 인스턴스는 구체 유형이고 Monad
의 인스턴스는 단일 유형 매개 변수를 필요로합니다. (. 도움이되는 설명을 Monoid vs MonadPlus 참조)하지만 당신은 Monad
및 Monoid
의 조합으로
(MonadPlus m) => ...
모든 유형의 제약 조건을 다시 쓰지 수 있을까?
(Monad m, Monoid (m a)) => ...
예컨대,
Control.Monad
에서
guard
기능을 가지고. 그것의 구현은 다음과 같습니다
guard' :: (Monad m, Monoid (m())) => Bool -> m()
guard' True = return()
guard' False = mempty
사람이 MonadPlus
및 Monad
+ Monoid
사이의 진정한 차이를 명확히 주 시겠어요 : 나는 그것을 구현할 수 있었다
guard :: (MonadPlus m) => Bool -> m()
guard True = return()
guard False = mzero
는 Monad
및 Monoid
사용하고 계십니까?
괜찮 으면 여기에서 구체적인 예를보고 싶습니다. MonadPlus가 Monoid보다 더 유용하거나 더 깨끗한 특정 Monads를 사용하여 몇 가지 인스턴스를 제공 할 수 있습니까? – Fresheyeball
@Fresheyeball : 아니요, "특정 모나드를 사용하는 일부 인스턴스"를 제공 할 수 없습니다. 죄송합니다. 모나드가 알려졌다면 m을 추상화 할 필요가 없으며 m 클래스의 예상 인터페이스를 지정하기 위해 유형 클래스를 사용할 필요가 없으므로 'MonadPlus'와'Monoid'의 차이는 코드가 특정 모나드에서만 작동합니다. – Toxaris
그 점을 이해합니다. 그러나 특정 모나드가 일반화 된 코드로 어떻게 작동 하는지를 보지 않고 연습을 개념화하기는 어렵다. – Fresheyeball