【发布时间】:2019-08-18 10:29:30
【问题描述】:
两种表达方式
y >> pure x
liftM (const x) y
在 Haskell 中具有相同的类型签名。 我很好奇它们是否等价,但我既无法证明这一事实,也无法举出反例。
如果我们重写这两个表达式,从而消除x和y,那么问题就变成了以下两个函数是否等价
flip (>>) . pure
liftM . const
请注意,这两个函数的类型均为 Monad m => a -> m b -> m a。
我使用 Haskell 为 monad、applicatives 和 functors 提供的定律将这两个语句转换为各种等价形式,但我无法在两者之间产生一系列等价。
比如我发现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
在我看来,这些都不是必然等价的,但我想不出它们不等价的任何情况。
【问题讨论】:
标签: haskell monads functor applicative