The (<*>) = ap
exigence이 (>>=)
약관에 명시 할 수 있습니다
u <*> v = u >>= \f -> fmap f v -- [1]
을 이제 AccValidation
의 Functor
및 Applicative
인스턴스를 제공, 우리는이 :
fmap _ (AccFailure e) = AccFailure e -- [2]
AccFailure e1 <*> AccFailure e2 = AccFailure (e1 <> e2) -- [3]
우리가 u = AccFailure e1
를 한 경우와 v = AccFailure e2
에서 [ 1], 우리는 다음을 얻습니다 :
AccFailure e1 <*> AccFailure e2 = AccFailure e1 >>= \f -> fmap f (AccFailure e2)
012 3,516,
대입 [2]와 [3] 즉, 우리 유도로에 :
AccFailure (e1 <> e2) = AccFailure e1 >>= \_ -> AccFailure e2 -- [4]
문제는 [4]와 같은 보유 (>>=)
것을 작성하는 것이 불가능하다는 것이다. 왼쪽은 e2
값에 따라 달라지며, 오른쪽 값은 \_ -> AccFailure e2 :: Semigroup e => a -> AccValidation e b
을 적용해야합니다. 그러나 적용 할 수있는 것은 없습니다. 특히 e1
의 유형이 잘못되었습니다. (이 부분에 대한 더 자세한 설명은 Cactus의 대답의 마지막 두 단락을 참조하십시오.) 따라서 AccValidation
에 과 일치하는 Monad
인스턴스를 제공 할 방법이 없습니다.
당신은 어떤 상상을하고 있습니까? '모두'에 대한 적용 가능한 인스턴스는 오류가없는쪽에 누적됩니다. – Alec
초기 단계에서 실패한 경우 나중에 "단계"를 실행할 수 없습니다. Applicative를 사용하면 성공적인 결과를 얻기 위해 적용 할 수 없더라도 나중 단계를 여전히 * 계산 * 할 수 있습니다. 따라서 나중 단계의 계산이 실패했는지 알 수 있습니다. Monad를 사용하면 각 단계에서 다음 단계가 반환되므로 나중에 단계가 무엇인지 모릅니다. – immibis
@Alec '어느 쪽인가'에 대한 신청자는 'AccValidation'이 누적되는 것과 동일한 의미로 '누적'하지 않습니다. 맞습니까? –