当我从GHC Applicative Complex
模块阅读Monad Complex
和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)
什么......? Applicative Complex
实例似乎将复数视为大小为二的数组。它们看起来更像是箭头操作。他们背后有数学基础吗?是否存在,它们用于什么?
答案 0 :(得分:8)
编辑在底部添加注释:“线性”包。
根据Trac 10609 ticket发起的a mailing list post添加了实例,其中Fumiaki Kinoshita指出基本库中有一些似乎只能通过一种方式定义的实例,并提出了一个补丁。添加它们。
据我所知,添加它们没有数学动机,尽管至少有一个数学上有意义的操作可以用来表达,即标量乘法:
> pure (*) <*> pure 2 <*> (3 :+ 4)
6 :+ 8
>
在上述邮件列表帖子的follow-up中,Edward Kmett指出他很赞成,因为他必须在Complex
个linear
包中添加孤儿实例多年弥补缺失的实例。
看起来他发现它们在为Additive
定义Complex
实例时非常有用,因此基本上使Complex
成为二维向量的特例。