the last touch probably
Jun. 9th, 2012 04:23 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
trait RightEitherFunctor[L] extends Functor[({type Maybe[A] = Either[L, A]})#Maybe] { def f1[A, B](f: A => B): Either[L, A] => Either[L, B] = _.right.map(f) } trait AccumulatingErrors[Bad] { val errorLog: Semigroup[Bad] implicit def acc(err: Bad) = errorLog.acc(err) type Maybe[T] = Either[Bad, T] object App extends Applicative[({type Maybe[A] = Either[Bad, A]})#Maybe] with RightEitherFunctor[Bad] { def pure[A](a: A):Either[Bad, A] = Right[Bad, A](a) implicit def applicable[A, B](maybeF: Maybe[A => B]) = { new Applicable[A, B, Maybe] { def <*>(maybeA: Maybe[A]) = maybeF match { case Left(badF) => maybeA match { case Left(errorA) => Left(badF <+> errorA) case Right(_) => Left(badF) } case Right(f) => maybeA match { case Left(badA) => Left(badA) case Right(a) => Right(f(a)) } } } } } }
Со стрелками пока не буду разбираться, а добавлю ещё пример какой-нибудь, положу всё на гитхаб (
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
И такое ощущение, что эту же хрень, в сокращённом виде, надо будет вставлять в рабочий код. В частности, недавно обсуждавшийся вопрос накопления ошибок - вот же ж решение, моноид. Ну в смысле полугруппа; моноид это у МакБрайда с Патерсоном; достаточно полугруппы.
Disclaimer. Эти знания бесполезны для 99% программистов.