复数仿函数和 monad 的含义和用法?

Meaning and usage of complex number functor and monad?

当我从 GHC Data.Complex 模块中阅读 Applicative ComplexMonad Complex 实例的源代码时,我有点惊讶:

-- | @since 4.9.0.0
instance Applicative Complex where
  pure a = a :+ a
  f :+ g <*> a :+ b = f a :+ g b
  liftA2 f (x :+ y) (a :+ b) = f x a :+ f y b

-- | @since 4.9.0.0
instance Monad Complex where
  a :+ b >>= f = realPart (f a) :+ imagPart (f b)

什么……? Applicative Complex 实例似乎将复数视为大小为 2 的数组。而且它们看起来更像是箭头操作。它们背后有什么数学基础吗?有没有,有什么用?

已编辑 在底部添加注释回复:"linear" 包。

根据此 Trac 10609 ticket initiated by a mailing list post 添加实例,其中 Fumiaki Kinoshita 指出基础库中缺少一些似乎只能以一种方式定义的实例,并提出了一个补丁来添加它们。

据我所知,添加它们没有数学动机,尽管至少有一个数学上有意义的运算可以应用地表达,即标量乘法:

> pure (*) <*> pure 2 <*> (3 :+ 4)
6 :+ 8
>

在上述邮件列表 post 的 follow-up 中,Edward Kmett 指出他赞成,因为他不得不将 Complex 的孤儿实例添加到他的 linear包年补遗失实例

看起来他发现它们在为 Complex 定义 Additive 实例时很有用,因此本质上使 Complex 成为二维向量的特例。