Applicative Functor中`pure`的目的是什么?

Sum*_*ora 7 haskell category-theory applicative

符合Applicative类型类.它位于Control.Applicative模块中,它定义了两种方法pure and <*>.它没有为它们中的任何一个提供默认实现,因此如果我们想要某些东西成为一个applicative functor,我们必须定义它们.

我试图了解谁在使用pure功能.我确实使用(<*>)了应用函子最有用的函数.但我不确定谁真正使用pure.

我读过类似的东西,pure (+3) <*> Just 10但它也可以写成Just (+3) <*> Just 10.

以上只是我有太多困惑.定义的真正目的是什么?pure何时使用它(或)已经使用它?

Rob*_*t K 8

<*> :: f (a -> b) -> f a -> f b,此运算符接受应用类型中的函数,以及应用类型中的值.因此,此运算符的第一个参数不能仅仅是一个函数,而是必须驻留在一个应用程序中.

pure函数解决了此处可能出现的问题(例如,想要应用不在应用程序中的函数).它接受一个当前不在应用程序中的函数,并将其提升到应用程序中.pure :: a -> f a

(+3) :: Int -> Int,并且Just 10 :: Maybe Int,你不能因此评估,(+3) <*> Just 10因为类型不起作用; 在(+3)已被提升到在一个价值Maybe应用性.

因为Maybe a,pureis 的定义pure = Just,这就是为什么你可以写pure (+3)或者Just (+3)

-

我会留给你看看<$>操作员:-)请记住,每个Applicative都是一个Functor.


fre*_*yle 5

pure是喜欢memptyMonoid.mempty是中立的mappend.pure也是中性的(在某种程度上)<*>,它可以提升一些价值到仿函数而没有任何影响或提升中性效果.

这句话可以用四个属性形式化(从文档复制/过去Applicative):

pure id <*> v = v
pure (.) <*> u <*> v <*> w = u <*> (v <*> w)
pure f <*> pure x = pure (f x)
u <*> pure y = pure ($ y) <*> u
Run Code Online (Sandbox Code Playgroud)

定义纯粹的真正目的是什么,何时使用它(或)已经使用它?

好吧,基本上用于编写更通用的代码.例如:

when :: Applicative f => Bool -> f () -> f ()
when p s = if p then s else pure ()

sequenceA_ :: Applicative f => [f a] -> f ()
sequenceA_ = foldr (*>) (pure ())

traverse_ :: Applicative f => (a -> f b) -> [a] -> f ()
traverse_ f = foldr ((*>) . f) (pure ())
Run Code Online (Sandbox Code Playgroud)

此外,有时使用pure起来更简单,然后隐式地将值包装到仿函数.例如,比较:

pure 3 ~ StateT (\s -> Identity (3, s))
Run Code Online (Sandbox Code Playgroud)


tre*_*ook 5

有几种情况可以使用pure

  1. 正如 freestyle 的答案所示,当您不知道Applicative正在使用什么具体内容时。

  2. 同样来自自由泳,只是使用起来更方便pure

除了在某些情况下更容易编写之外,它还可以使您的代码更加健壮。随着我开发软件,我的关键数据结构经常发生变化。使用pure而不是特定的构造函数有助于创建在重构期间可以保持不变的代码点。

  1. 具体实施时Applicative不可用。

有时,库不会导出其数据类型的构造函数。相反,它们依赖函数来构建类型的有效实例。使该类型成为 的成员Applicative是实现此目的的一种方法。Monad IO(Applicative)是构造函数不可用的类型的另一个示例。相反,我们被迫使用pure(又名return)。