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

时间:2019-11-11 09:16:16

标签: haskell monads functor applicative

我可以使用monad定义它们。

using (var httpClient = new HttpClient())
{
          using (var request = new HttpRequestMessage(new HttpMethod("GET"), "http://192.168.1.1/"))
                {
                    var response = await httpClient.SendAsync(request);
                }
}

(<*) :: 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可以在顺序和并行两种方式下工作吗? Monad只是应用程序的一个子类别,仅能按顺序执行事务。而且,即使像阅读器monad之类的少数monad的操作顺序无关紧要(例如,从(<\*)环境设置中读取配置),

1 个答案:

答案 0 :(得分:4)

标准定义是

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

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

另一个类似。