复数仿函数和 monad 的含义和用法?
Meaning and usage of complex number functor and monad?
当我从 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 的数组。而且它们看起来更像是箭头操作。它们背后有什么数学基础吗?有没有,有什么用?
已编辑 在底部添加注释回复:"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
成为二维向量的特例。
当我从 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 的数组。而且它们看起来更像是箭头操作。它们背后有什么数学基础吗?有没有,有什么用?
已编辑 在底部添加注释回复:"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
成为二维向量的特例。