Два выражения
y >> pure x
liftM (const x) y
имеют одинаковую сигнатуру типа в Haskell. Мне было любопытно, были ли они эквивалентны, но я не мог представить ни доказательства этого факта, ни контрпример против него.
Если мы переписываем два выражения, чтобы исключить x
и y
возникает вопрос, эквивалентны ли две следующие функции
flip (>>) . pure
liftM . const
Обратите внимание, что обе эти функции имеют тип Monad m => a → mb → ma
.
Я использовал законы, которые Haskell дает для монады, аппликативов и функторов, чтобы преобразовать оба утверждения в различные эквивалентные формы, но я не смог произвести последовательность эквивалентностей между ними.
Например, я обнаружил, что 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
Ни одно из этих обстоятельств не является для меня равнозначным, но я не могу представить ни одного случая, когда они не были бы эквивалентны.