2014-02-28 28 views
13

是否有任何不是Applicative的好例子Functor?好的,我正在寻找不需要申诉undefined的非平凡(不是Const Void)的例子。如果没有任何方法可以证明那里的空间是无趣的?没有应用程序的仿真器的例子

这与Good examples of Not a Functor/Functor/Applicative/Monad?类似,但在那里没有完全解决。

作为后续问题,有没有可能不Applicative情况下,留给由于有太多的不规范Applicative情况下是有意义的Functor S的任何有趣的例子?例如,“扩展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

作为边注,'数据MAYB一个=只求一个| Nothin Int'和'Nothin n1 <*> Nothin n2 = Nothin $ max n1 n2'是我如何实现它的。然后你会看到更高层次优先的失败等级的概念。不确定这在哪里有用,但很容易编码。 – bheklilr

+2

定义无趣会很好。据我所知,'Cont m'是一个应用iff'm'是一个幺半群,因此有很多函数 - 那里没有应用。基本上,任何与我们定义函数的参数无关的“结构”很多的东西都将很难成为应用程序。 – jozefg

+0

@bheklilr这很明智,还有“纯粹应用的Either”数据Eit b a = L b |具有实例Monoid b => Applicative(或b)其中L b1 <*> L b2 = L(b1 <> b2)'。但是,通常情况下,融合失败的方法有很多,“纯粹适用于任一”是我所知道的与规范方法最接近的东西。 –

回答

5

我看到functor而不是applicatives的主要地方是大型产品类型。考虑像

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的东西,这是一个独异样在只填写至少有一种方法和Mean从来没有,因为我们没有办法指定某些东西来以关联的方式组合任意类型g :: ag' :: b的两个值。

此外,我们需要mempty或类似的东西pure :: a -> f a。我们得到了一个a,因此涉及到a的大部分数据类型都是微不足道的构造,但其余的需要一个理智的“空”值。

所以如果我们把应用和仿函数砸成一个大类,大部分lens都会崩溃,因为镜头的大多数有用的例子都涉及这样的情况,其中没有一个理智的实例。我们需要一种合并所有类型参数的方法来解决这个问题,所以我们需要一种方法来合并所有的类型这种“东西”并不总是可能的。

+2

'Int - > Bool'可以在很多方面变成一个monoid。 “Bool”可以用我认为的四种方式做成一个monoid,然后你多次使用产品“Int”。 –

+0

'实例Monoid(Int - > Bool)其中{mempty = const False; mappend f1 f2 = \ x - > f1 x || f2 x}' – Tarmil

+0

你也可以总是定义最左边的monoid:'Bar i g f <*> Bar __ a = Bar i g(f a)' –

3

一个很重要的(如果不公平)的例子是

{-# LANGUAGE ExistentialQuantification #-} 

data AFunctor a = forall f . Functor f => AFunctor { unFunct :: f a } 
相关问题