Functor
的{{1}}是否有Applicative
s?好的,我正在寻找不需要诉诸Const Void
的非平凡(不undefined
)个例子。如果没有,是否有任何方法可以证明那里的空间无趣?
这类似于Good examples of Not a Functor/Functor/Applicative/Monad?,但在那里并没有完全解决。
作为一个后续问题,是否存在Functor
的任何有趣示例,由于存在太多非规范Applicative
个实例,因此可能没有Applicative
个实例有意义?例如,“扩展Maybe
”有点无聊
data MayB a = Jus a | Nothing1 | Nothing2 | Nothing3 | ...
instance Applicative MayB where
pure = Jus
Jus f <*> Jus x = Jus (f x)
Jus f <*> n = n
n <*> Jus x = n
n1 <*> n2 = methodOfResolvingNothingWhatsoever n1 n2
是否存在Applicative
实例的变体更具实质性的示例?
答案 0 :(得分:5)
我看到仿函数但不是应用程序的主要地方是大型产品类型。考虑像
这样的东西 data Mean where
Unfair :: Monad a => a () -> Mean
data Foo a = Bar Int Mean a
这很容易成为一个仿函数,但是没有办法让它成为一个应用程序,因为
(Bar i g f) (Bar i' g' a) = Bar ??? ??? (f a)
我们只能用至少一种方式填充我们的???
s和类似monoid的东西,Mean
永远不会填充,因为我们无法指定某些内容来组合任意类型的两个值1}}和g :: a
以关联方式。
此外,我们需要g' :: b
或类似mempty
的内容。我们给了pure :: a -> f a
,因此大多数涉及a
的数据类型都很容易构建,但其余的需要一个理智的“空”值。
因此,如果我们将应用程序和仿函数粉碎成一个大型类,大多数a
都会崩溃,因为镜头的大多数有用情况都涉及这样的情况,其中没有理智{{1}实例。
所以要把它放在一个手挥动的方式:当一个类型中有很多“东西”与类型参数没有直接关联时,我们需要一种方法来合并所有的这个“东西”并不总是可能的。
答案 1 :(得分:3)
一个非常重要(如果不公平)的例子是
{-# LANGUAGE ExistentialQuantification #-}
data AFunctor a = forall f . Functor f => AFunctor { unFunct :: f a }