如何根据绑定定义应用?

问题描述 投票:1回答:3

在Haskell中,Applicatives被认为比Functor强,这意味着我们可以使用Applicative来定义Functor,如

-- Functor
fmap :: (a -> b) -> f a -> f b
fmap f fa = pure f <*> fa

并且Monad被认为比Applicatives&Functor更强大。

-- Functor
fmap :: (a -> b) -> f a -> f b
fmap f fa = fa >>= return . f

-- Applicative
pure :: a -> f a
pure = return

(<*>) :: f (a -> b) -> f a -> f b
(<*>) = ???  -- Can we define this in terms return & bind? without using "ap" 

我读过Monad用于排序动作。但是我觉得Monad唯一能做的就是Join或Flatten,其余功能来自Applicatives。

join :: m (m a) -> m a
-- & where is the sequencing in this part? I don't get it.

如果Monad确实用于排序动作,那么我们怎么定义Applicatives(不被认为严格地按顺序运行,而是某种并行计算)?

因为monad是endofunctors类别中的Monoid。也有可交换的monoid,不一定必须按顺序工作。这意味着可交换Monoid的Monad实例也需要排序吗?

编辑:我发现了一个很棒的页面http://wiki.haskell.org/What_a_Monad_is_not

haskell monads functor applicative
3个回答
5
投票

如果Monad确实用于排序动作,那么我们怎么定义Applicatives(不被认为严格地按顺序运行,而是某种并行计算)?


4
投票

我们可以复制ap的定义并对其进行解糖:


1
投票

():: f(a-> b)-> f a-> f b

© www.soinside.com 2019 - 2024. All rights reserved.