Два выражения
y >> pure x
liftM (const x) y
имеют одинаковую сигнатуру типа в Haskell.Мне было любопытно, были ли они эквивалентны, но я не смог ни привести ни доказательства факта, ни контрпримера против него.
Если мы переписываем два выражения, чтобы исключить x
и y
тогда возникает вопрос, эквивалентны ли две следующие функции
flip (>>) . pure
liftM . const
Обратите внимание, что обе эти функции имеют тип Monad m => a -> m b -> m a
.
Я использовал законы, которые Хаскелл дает для монады, аппликативов ифункторы для преобразования обоих операторов в различные эквивалентные формы, но я не смог произвести последовательность эквивалентностей между ними.
Например, я обнаружил, что y >> pure x
можно переписать следующим образом
y >>= const (pure x)
y *> pure x
(id <$ y) <*> pure x
fmap (const id) y <*> pure x
и liftM (const x) y
можно переписать следующим образом:
fmap (const x) y
pure (const x) <*> y
Ни одно из этих обстоятельств не является для меня обязательным, но я не могу представить ни одного случая, когда они не были бы эквивалентными.