如何用 (<*>) 和 pure 来定义 (*>), (<*)?

How to define (*>), (<*) in terms of (<*>) and pure?

我可以使用 monad 来定义它们。

(<*) :: Monad m => m a -> m b -> m a
(<*) fa fb = fa >>= \a -> (fb >>= \_ -> return a)
(<*) fa fb = ??? -- In terms of pure & (<*>)

(*>) :: Monad m => m a -> m b -> m b
(*>) fa fb = fa >>= \_ -> (fb >>= \b -> return b)
(*>) fa fb = ??? -- In terms of pure & (<*>)

(\*>)(<\*) 被视为排序运算符。我可以安全地假设 Applicatives 可以在 Sequential 和 Parallel 中工作吗? Monad 只是应用程序的一个子类别,只能按顺序执行操作。即使像 reader monad 这样的几个 monad 的操作顺序并不重要(例如从 HashMap 环境设置中读取配置)?

标准定义是

(<*) :: Applicative m => m a -> m b -> m a
(<*) fa fb = (\a _ -> a) <$> fa <*> fb

然后我们可以应用定律 f <$> x = pure f <*> x 仅使用 <*>pure

另一个类似。