如何用 (<*>) 和 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
。
另一个类似。
我可以使用 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
。
另一个类似。