表示元组应用

时间:2017-07-10 10:31:16

标签: haskell

我正在尝试理解元组应用程序。当我查看关于元组的前奏中的信息时,它说:

instance (Monoid a, Monoid b) => Monoid (a, b)
instance Monoid a => Applicative ((,) a)

((,) a)是什么意思?它看起来不像一个元组。

我有以下示例:

Prelude Data.Monoid> ((Sum 2), (+2)) <*> ((Sum 45), 8)
(Sum {getSum = 47},10)

元组中的第一个参数是monoid的实例,第二个参数只是一个函数应用程序。但是签名((,) a)如何与上面的示例相匹配?

1 个答案:

答案 0 :(得分:1)

我更喜欢将实例编写为元组部分(实际上并不是合法的Haskell,而是指出了这一点:

instance Monoid a => Applicative (a,)

......在讨论之前,请考虑

instance Functor (a,)

这样做只是:对于任何左手元素(类型a),映射任何右手参数。即。

  fmap :: (b -> c) -> (a,b) -> (a,c)

有人可能会想到为什么我们有(a,)而不是(,a)。嗯,从数学上讲,以下内容同样有效:

instance Functor (,a)
  fmap :: (a -> b) -> (a,c) -> (b,c)

...但是无法定义,因为(a,b)实际上是(,) a b的语法糖,即元组类型构造函数(,)首先应用于{{1}键入然后输入a类型。现在,在b中,我们只是将instance Functor (a,)打开以进行fmap,因此

b

但是,在instance Functor ((,) a) 打开的情况下,_only应用b参数是不可能的 - 这需要一种类型级别的lambda

a

不受支持。

现在至于“instance Functor (\b -> (a,b))” - 只是扩展Applicative仿函数以支持多个元组的组合,前提是已经有自然方式来组合{{1} } elements - 这就是(a,)实例提供的内容。这更好地称为Writer monad,因为它非常适合生成“操作日志”以及实际计算结果:

a