(частичный производный ответ?)
Я верю, что @chi верен , когда они выдвигают гипотезу , что Const m
не может быть законным Decidable
длявсе Monoid
s m
, но я основываю это на предположениях о Decidable
законах.
В документах мы получаем этот дразнящий намек на Decidable
law:
Кроме того, мы ожидаем того же рода закона распределения, который удовлетворяет обычная ковариантная альтернатива, по отношению к Applicative, которая должна быть полностью сформулирована и добавлена здесь в какой-то момент!
Какого рода распределительные отношения должны быть между Decidable
и Divisible
?Ну, у Divisible
есть chosen
, который строит вещь, принимающую продукт, из элементов, принимающих элементы, и Decidable
имеет divided
, которая строит вещь, принимающую сумму из вещей, принимающих элементы.Поскольку продукты распределяются по суммам, возможно, закон, который мы ищем, относится от f (a, Either b c)
к f (Either (a, b) (a, c))
, значения которых можно построить с помощью a `divided` (b `chosen` c)
и (a `divided` b) `chosen` (a `divided` c)
соответственно.
Так что я буду выдвигать гипотезучто отсутствующий закон Decidable
является чем-то вроде
a `divided` (b `chosen` c) = contramap f ((a `divided` b) `chosen` (a `divided` c))
where f (x, y) = bimap ((,) x) ((,) x) y
, что действительно удовлетворяется для Predicate
, Equivalence
и Op
(три Decidable
случая, которые я принялпока что время проверять).
Теперь я считаю, что единственный экземпляр, который вы можете иметь для instance Monoid m => Decidable (Const m)
, использует mempty
для lose
и mappend
для choose
;любой другой выбор, а затем lose
больше не является идентификатором для choose
.Это означает, что вышеприведенный закон распределения упрощает до
a `mappend` (b `mappend` c) = (a `mappend` b) `mappend` (a `mappend` c)
, что является явно фальшивым неправдой в произвольном Monoid
(хотя, как замечает Сьорд Висшер, в некоторых * 1058 это верно* s - так что Const m
все еще может быть законным Decidable
, если m
является распределительным моноидом).