haskell 复数函子与单子的意义与用法?

cuxqih21  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(195)

当我从GHC Data.Complex模块中读到Applicative ComplexMonad Complex示例的源代码时,我感到有点惊讶:

  1. -- | @since 4.9.0.0
  2. instance Applicative Complex where
  3. pure a = a :+ a
  4. f :+ g <*> a :+ b = f a :+ g b
  5. liftA2 f (x :+ y) (a :+ b) = f x a :+ f y b
  6. -- | @since 4.9.0.0
  7. instance Monad Complex where
  8. a :+ b >>= f = realPart (f a) :+ imagPart (f b)

搞什么......?Applicative Complex示例似乎将复数视为大小为2的数组。而且它们看起来更像是箭头运算。它们背后有数学基础吗?不管有没有,它们都有什么用?

6bc51xsx

6bc51xsx1#

  • 已编辑 *,在底部添加注解:“线性”封装。

根据a mailing list post启动的Trac 10609 ticket添加示例,其中Fumiaki Kinoshita注意到基础库中缺少一些示例,这些示例似乎只能以一种方式定义,并建议添加补丁。
就我所知,把它们相加并没有数学上的动机,尽管至少有一个数学上有意义的运算可以用应用的方式来表达,那就是标量乘法:

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

在上述邮件列表帖子的follow-up中,Edward Kmett指出,他赞成这一点,因为多年来他不得不将Complex的孤立示例添加到他的linear包中,以弥补缺失的示例。
看起来他发现它们在为Complex定义Additive示例时很有用,从而本质上使Complex成为二维向量的特例。

vsaztqbk

vsaztqbk2#

(由于我没有声誉发表评论,请随意调整。)
K. A. Buhr的答案解决了除了Monad示例之外的所有问题,这是最奇怪的。在数学上,Complex确实形成了一个单子,由方程(a + bi) + (c + di)i = (a - d) + (b + c)i规定。当然,这需要我们使用加法和减法的概念来处理类型类。
(对user2407038,则:即使这个Monad示例是“合法”,也有充分的理由不存在:它不是实现预期行为的示例。)
顺便说一下:这在blog post中进行了简要讨论。

相关问题