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

时间:2017-11-08 13:32:39

标签: haskell monads functor complex-numbers applicative

当我从GHC Applicative Complex模块阅读Monad ComplexData.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实例似乎将复数视为大小为二的数组。它们看起来更像是箭头操作。他们背后有数学基础吗?是否存在,它们用于什么?

1 个答案:

答案 0 :(得分:8)

编辑在底部添加注释:“线性”包。

根据Trac 10609 ticket发起的a mailing list post添加了实例,其中Fumiaki Kinoshita指出基本库中有一些似乎只能通过一种方式定义的实例,并提出了一个补丁。添加它们。

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

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

在上述邮件列表帖子的follow-up中,Edward Kmett指出他很赞成,因为他必须在Complexlinear包中添加孤儿实例多年弥补缺失的实例。

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