2017-11-08 21 views
9

나는 좀 놀랐습니다 :복소수 펑터와 모나드의 의미와 용도는 무엇입니까? 내가 GHC <code>Data.Complex</code> 모듈에서 <code>Applicative Complex</code> 및 <code>Monad Complex</code>의 인스턴스의 소스 코드를 읽을 때

-- | @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에 의해 인스턴스가 추가되었습니다. Fumiaki Kinoshita는 기본 라이브러리에 한 가지 방법으로 만 정의 될 수있는 인스턴스가 누락되어 추가 할 수있는 패치를 제안했음을 지적했습니다.

제가보기에 추가 대한 수학적 동기 applicatively 표현 될 수있는 적어도 하나 개의 수학적 의미있는 동작, 즉 스칼라 승산이 비록 없었다 다음에 follow-up에서

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

을 에드워드 크 메트 (Edward Kmett)는 누락 된 인스턴스를 보충하기 위해 Complex 패키지에 고아 인스턴스를 추가해야만했기 때문에 자신의 패키지에 패키지를 추가해야한다고 말했다.

그가 Complex에 대한 Additive 인스턴스를 정의하는 데 유용하다는 사실을 알게되었으므로 본질적으로 Complex을 2 차원 벡터의 특수 사례로 만듭니다.