如上所述这个问题/答案,Functor实例唯一确定的,如果他们存在.
对于列表,有两个众所周知的Applicative实例:[]和ZipList.因此,应用型不是唯一的(见GHC可以导出函子与应用型实例的单子变压器?而且为什么没有-XDeriveApplicative推广?).但是,ZipList需要无限列表,因为它pure无限期地重复给定元素.
Applicative实例?去进一步,如果我们能够扩大双方[]和ZipList一个单子,我们会在那里有一个单子不是唯一的数据类型和其确定的函数对象的例子.唉,只有当我们将自己限制在无限列表(流)时才有ZipList Monad实例.并且为了创建单元素列表,所以它需要有限列表.因此:return[]
如果有一个包含两个或更多不同实例的示例,则会出现一个明显的问题,如果它们必须/可以具有相同的Applicative实例:
最后我们可以为Alternative/MonadPlus提出同样的问题.由于存在两组不同的MonadPlus法则,这很复杂.假设我们接受一套法律(对于Applicative我们接受右/左分配/吸收,也参见这个问题),
如果以上任何一个都是独一无二的,我会有兴趣知道为什么,要有一丝证明.如果没有,反例.
"类似的论点也表明,满足第一定律的任何Functor实例(fmap id = id)也会自动满足第二定律.实际上,这意味着只需要检查第一定律(通常通过非常简单的归纳法)确保Functor实例有效."
如果是这种情况,为什么我们甚至提到第二个仿函法?
Law 1: fmap id = id
Law 2: fmap (g . h) = (fmap g) . (fmap h)
Run Code Online (Sandbox Code Playgroud) 这是绑定方法的类型声明:
(>>=) :: (Monad m) => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
我按如下方式阅读:将一个返回包装值的函数应用于包装值.
此方法作为Monad类型类的一部分包含在Prelude中.这意味着有很多情况需要它.
好的,但我不明白为什么它是典型案例的典型解决方案.
如果您已经创建了一个返回包装值的函数,为什么该函数尚未包含值?
换句话说,有许多函数采用正常值但返回包装值的典型情况是什么?(而不是获取包装值并返回包装值)