没有应用程序的函数的示例

时间:2014-02-28 15:37:49

标签: haskell functor applicative

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实例的变体更具实质性的示例?

2 个答案:

答案 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永远不会填充,因为我们无法指定某些内容来组合任意类型的两个值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 }