문제

나는 작은 성공을 감싸는 내 머리 주변의 기본적인 배관의 유형에 관여 ad 패키지입니다.예를 들어,다음과 같은 완벽하게 작동:

import Numeric.AD

ex :: Num a => [a] -> a
ex [x, y] = x + 2*y

> grad ex [1.0, 1.0]
[1.0, 2.0]

grad 는 유형:

grad
  :: (Num a, Traversable f) =>
     (forall (s :: * -> *). Mode s => f (AD s a) -> AD s a)
     -> f a -> f a

변경하는 경우 형식의 서명 ex 하기 [Double] -> Double 하고 동일한 작업을 수행합니다,나는

Couldn't match expected type `AD s a0' with actual type `Double'
Expected type: f0 (AD s a0) -> AD s a0
  Actual type: [Double] -> Double

같은 행동할 때 발생 교체 Double 겉으로는 어떤 유형을 생성자를 가진 종류 * 는 인스턴스화 Num.

Traversable f 은 목록의 첫 번째 인수 grad 이 있어야 합 유형 [AD s a] -> AD s a 일부를 허용 Mode -예를 들어, Reverse.그러나 분명히 사용자의 grad 지 않을 처리 AD 생성자 또는 Mode 이 직접 있습니다.엿보로 이러한 내부 남아있는 나에게 조금;특히,나는 따를 수 없는 종류/유형 트레일 사이의 차이로 사용 Num a => [a] -> a[Double] -> Double.

왜 입력명 [Double] -> Double 문제가 발생 grad?과의 관점에서 일반 기존 라이브러리를 사용:어떤 방법을 사용하여 [Double] -> Doubleex, 하거나,또는 다형 버전이 필요합니까?

(제목에서 영감을 이와 유사한 질문)

도움이 되었습니까?

해결책

지 알 ad 라이브러리이지만,이후 grad 예상한 기능의 유형 [AD s a] -> AD s a 그 첫 번째 매개 변수를 기대할 수 없습을 전달 할 수있는 기능의 유형 [Double] -> Double, 이후 DoubleAD 는 완전히 다른 유형이 있습니다.

일반 기능 Num 제약 조건이기 때문에,작동 AD 자체도의 인스턴스 Num, 따라서 귀하에 들어, ex 을 얻을 전문화하는 뭔가

ex :: (Mode s, Fractional a) => [AD s a] -> AD s a

하려면 전문 ex 계산에 사용하는 두 배로,당신이 그것을 줄 필요가 서명 등

ex :: Mode s => [AD s Double] -> AD s Double
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top