том. Где гарантия, что нижеприведенная функция не кинет "Ratio has zero denominator", если нет закона, что empty *> f ≡ empty?
divA :: Alternative a => Rational -> Rational -> a n
x `divA` y = guard (y /= 0) *> pure (x / y)
Или такой закон есть, и я просто не нашёл где он задокументирован?
x * 0 = x * (0 + 0) = x * 0 + x * 0 убираем x * 0 с обоих сторон: 0 = x * 0 получается если есть левая или правая дистрибутивность на полукольце, то аддитивный нуль будет поглощающим по умножению аппликатив (мультипликативный моноид на эффектах) и альтернатива (аддитивный) образуют такое полукольцо (имеют дистрибутивность), но не всегда, поэтому и закона похоже нет
Есть закон empty <*> a = empty, что я полагаю является более общим. Но это выполняется не для всех альтернативов и потому не упоминается по умолчанию. Можно тут посмотреть: https://en.m.wikibooks.org/wiki/Haskell/Alternative_and_MonadPlus в "Other suggested laws"
Обсуждают сегодня