2017-11-08 9 views
9

私はGHC Data.ComplexモジュールからApplicative ComplexMonad 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の配列として扱うようです。両方とも矢印操作のよ​​うに見えます。それらの背後には数学的根拠はありますか?そこにあるかどうか、彼らは何のために使われていますか?

+0

これは法を遵守しているインスタンスなので、存在しない理由はありません(これは「数学的な」基準です)。 – user2407038

+0

複雑な分析への接続はなく、複素数はここではサイズ2の配列ですか? –

+0

複素数*は、ある意味ではサイズ2の配列です。ℂは²²と同型です。 – chepner

答えて

8

編集「直線」パッケージの末尾に注記を追加します。

a mailing list postによって開始されたこのTrac 10609 ticketのインスタンスが追加されました。木下ふみあきは、一方向にのみ定義できるように見える基本ライブラリにインスタンスがあり、追加するパッチを提案したと指摘しました。へfollow-up

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

:applicatively表現することができる少なくとも1つの数学的に意味のある操作、すなわちスカラー倍はありますけれども

は、私の知る限り見ることができるように、それらを追加するための数学的な動機は、ありませんでした上記のメーリングリストの投稿より、Edward Kmett氏は、紛失したインスタンスを補うために、Complexの孤立したインスタンスをlinearパッケージに追加しなければならなかったので、

ComplexのためにAdditiveインスタンスを定義する際に有用であることがわかりました。したがって、本質的に2次元ベクトルの特殊なケースになります。

関連する問題