当我从GHC Data.Complex
模块中读到Applicative Complex
和Monad 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的数组。而且它们看起来更像是箭头运算。它们背后有数学基础吗?不管有没有,它们都有什么用?
2条答案
按热度按时间6bc51xsx1#
根据a mailing list post启动的Trac 10609 ticket添加示例,其中Fumiaki Kinoshita注意到基础库中缺少一些示例,这些示例似乎只能以一种方式定义,并建议添加补丁。
就我所知,把它们相加并没有数学上的动机,尽管至少有一个数学上有意义的运算可以用应用的方式来表达,那就是标量乘法:
在上述邮件列表帖子的follow-up中,Edward Kmett指出,他赞成这一点,因为多年来他不得不将
Complex
的孤立示例添加到他的linear
包中,以弥补缺失的示例。看起来他发现它们在为
Complex
定义Additive
示例时很有用,从而本质上使Complex
成为二维向量的特例。vsaztqbk2#
(由于我没有声誉发表评论,请随意调整。)
K. A. Buhr的答案解决了除了
Monad
示例之外的所有问题,这是最奇怪的。在数学上,Complex
确实形成了一个单子,由方程(a + bi) + (c + di)i = (a - d) + (b + c)i
规定。当然,这需要我们使用加法和减法的概念来处理类型类。(对user2407038,则:即使这个
Monad
示例是“合法”,也有充分的理由不存在:它不是实现预期行为的示例。)顺便说一下:这在blog post中进行了简要讨论。