Вы путаете математический l aws и правильность с правильностью ваших программ.
Во-первых, Monad, Monoid, Fold et c. не л aws. Это математические «структуры», которые происходят из Теории категорий . Эти «структуры» обладают определенными свойствами, которым они должны придерживаться, чтобы быть надежными и правильными. Один набор этих свойств, например, известен как Монади c L aws
Любая структура Монади c в математике должна подчиняться этим 3 правилам:
- Левое удостоверение
- Правое удостоверение
- Ассоциативность
Операции с Monad, flatMap и pure (или объединение и возврат в математике) имеют чтобы быть правильным по отношению к этим l aws, чтобы нормально функционировать. ie pure(a).flatMap(f) == f(a)
, M.flatMap(pure) == M
et c.
В функциональном программировании монады - это шаблон проектирования, полученный из этих математических структур и l aws. Они описывают некоторые «составные вычисления». В кошках Монада определяется как класс типов . Эта структура соответствует вышеупомянутым правилам.
Как мне написать l aws для алгебры DbConnector
Если вы хотите доказать l aws, вы, вероятно, должны необходимо использовать средство доказательства теорем, на самом деле нет способа явно написать или протестировать l aws в Scala, но вы всегда можете написать модульные тесты, чтобы убедиться, что ваша монада соблюдает этот закон, т.е. testFlatMapLeftIdentity(...)
et c .
Нужно ли моим алгебрам l aws или достаточно написать модульные тесты?
Короче говоря, я не могу придумать случай, когда алгебра имеет явное l aws, если ваша алгебра не описывает некоторый математический набор операций. Например, в вашем коде контекстная привязка MonadError[*[_], Throwable]]
требует Monad[F]
в области видимости, которая должна соответствовать этим l aws, предполагая, что вы используете общий IO, Task, Future
et c., Кошки сделали это так что вам не нужно беспокоиться об этих l aws. Если вы когда-нибудь решите реализовать свой собственный тип эффекта или написать новую реализацию Monad, вам нужно будет убедиться, что вы придерживаетесь этих l aws, но в вашем коде нет ничего, что заставляло бы вас беспокоиться о них. Было бы достаточно написать хорошие модульные тесты для этой алгебры.