复数functor和monad的含义和用法?

Dan*_*Dos 9 monads haskell functor complex-numbers applicative

我是有点惊讶,当我读的情况下的源代码Applicative ComplexMonad Complex从GHC Data.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)
Run Code Online (Sandbox Code Playgroud)

什么......?该Applicative Complex实例似乎将复数视为大小为二的数组.它们看起来更像是箭头操作.他们背后有数学基础吗?是否存在,它们用于什么?

K. *_*uhr 8

编辑在底部添加注释:"线性"包.

这些实例是根据邮件列表帖子发起的Trac 10609票据添加的,其中Fumiaki Kinoshita注意到基本库中有一些似乎只能以一种方式定义的缺失实例,并提出了添加它们的补丁.

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

> pure (*) <*> pure 2 <*> (3 :+ 4)
6 :+ 8
>
Run Code Online (Sandbox Code Playgroud)

在上述邮件列表帖子的后续文章中,Edward Kmett指出他很赞成,因为他不得不多年来为Complex他的linear包裹添加孤儿实例以弥补丢失的情况.

看起来他发现它们在定义一个Additive实例时非常有用,Complex因此基本上可以创建一个Complex二维向量的特例.