현재 Alternative/MonadPlus의 안경은 wikibooks입니다. 차이점을 잘 설명합니다. 그러나, 난처한 부분은 guard
함수입니다.이 함수는 계산을 "단락"하는 데 사용됩니다. (맞습니까?)MonadPlus 제약 조건으로`guard`가 정의되지 않은 이유는 무엇입니까?
Control.Monad
에 정의되어 있지만 기능이 guard
인 경우 Alternative
제약 조건이 있습니다 (link).
guard :: (Alternative f) => Bool -> f()
guard True = pure()
guard False = empty
그러나 위의 기사 만 MonadPlus
가 왼쪽 제로 오른쪽 제로 법 (따라서 강한 주장을) 시행 할 필요가 있음을 언급하고있다.
mzero >>= f = mzero -- left zero
m >> mzero = mzero -- right zero
이 guard
기능의 목적을 감안할 때, 그것은 MonadPlus
제약 조건으로 정의되어서는 안된다? guard
가 계산을 "단락"한다고 가정 할 때 더 강력한 법칙이 필요하지 않습니까? 특정 디자인 선택의 이유에 대해 궁금합니다.
p.s : "단락"이라는 단어 이외의 "선행 계산 취소"동작을 설명하는 더 좋은 방법은 무엇인지 모르겠습니다.
'MonadPlus'는'Alternative'보다 강력하고'guard '를 쓰는'MonadPlus'는 필요 없습니다 - 대체 형을 가진 타입이 가장 일반적인 타입, 즉 유추 된 타입입니다. 왜 더 강한 유형을 부여할까요? (wikibooks 페이지는 AMP 이후 구식이므로 ghc 8 이상은 기억하지 못합니다.) – user2407038
@ user2407038 가드가해야 할 경우 더 강력한 법칙 (0, 오른쪽 영점)이 필요하지 않습니다. "단락"? – zeronone
'Applicative' 컨텍스트에서'short circuiting '을 얻습니다 :'guard False *> x = empty'와'guard True *> x = x'; 'Monad '에서'Applicative '가 작동하는 모든 것이 모나드에서 작동하는 것과 똑같은 자연스러운 방식으로'Monad '에서도 작동합니다. – user2407038