没有Applicatives的Functors示例

13

是否存在一些优秀的实现了 Functor 但未实现 Applicative 的例子?这里的“优秀”是指非平凡的(不是 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 实例的变化更加重要?


顺便提一下,data MayB a = Jus a | Nothin IntNothin n1 <*> Nothin n2 = Nothin $ max n1 n2 是我实现它的方式。然后你就有了一个失败级别的概念,其中较高级别优先。不确定这在哪里有用,但很容易编码。 - bheklilr
2
定义无趣的东西会很好。据我所知,如果 m 是一个幺半群,那么 Cont m 就是一个可应用函子,因此有很多不是可应用函子的函子。基本上,任何具有大量与我们定义的函子参数无关的“结构”的东西都很难成为可应用函子。 - daniel gratzer
@J.Abrahamson 我试图让我的想法更清晰一些,不确定是否成功。 - daniel gratzer
我认为Const比它所得到的赞誉更有趣。与大型产品和一般镜头用途的联系表明,除了函子参数之外,拥有结构是多么普遍。 - Anthony
@jozefg 这是错误的。在 Haskell 中,所有的 Monad 都是 Applicative。 - Sassa NF
显示剩余4条评论
2个回答

5

我看到函数子但没有应用在大型产品类型中的主要场所。考虑像这样的东西

 data Mean where
    Unfair :: Monad a => a () -> Mean
 data Foo a = Bar Int Mean a

这很容易成为一个函数对象(functor),但无法使其成为适用函子(applicative functor)因为:
 (Bar i g f) (Bar i' g' a) = Bar ??? ??? (f a)

我们只能使用至少在某一方面类似于单子的东西来填充我们的???,而Mean从没有,因为我们无法指定如何以可结合的方式组合任意类型的两个值g::ag'::b
此外,我们需要mempty或类似mempty的东西来pure::a->f a。我们有一个a,所以大多数涉及a的数据类型都很容易构造,但其余部分需要一个明智的“空”值。
因此,如果我们将适用性和函子混合到一个大型类型类中,大多数lens将会崩溃,因为lens的大多数有用情况涉及正是这种情况,即没有明智的Applicative实例。
因此,用一种手摇的方法来说:当一个类型中有很多与类型参数应用程序无关的“东西”时,我们需要一种方法来合并所有这些“东西”,这并不总是可能的。

2
Int -> Bool 可以用多种方式成为一个幺半群。我认为 Bool 可以用四种方式成为一个幺半群,然后你可以将其乘积重复 Int 次。 - Tom Ellis
instance Monoid (Int -> Bool) where { mempty = const False; mappend f1 f2 = \x -> f1 x || f2 x } - Tarmil
@TomEllis 嗯,我说得不太准确——我的定义只定义了半群部分,但是你对这些具体类型很熟悉,因为这里可能有 2^N * Nmempty: pure = Bar 0 (const True) - J. Abrahamson
哦,抱歉。你完全正确。你需要“Maybe”。 - J. Abrahamson
@TomEllis 哦,你说得完全正确,那只是我粗心犯的错误,我会编辑一个不是单子的示例 :) - daniel gratzer
显示剩余5条评论

3
一个非常重要(但不公平)的例子是:
{-# LANGUAGE ExistentialQuantification #-}

data AFunctor a = forall f . Functor f => AFunctor { unFunct :: f a }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接