허용 가능한 유형에서는 숫자입니다.광고
-
11-12-2019 - |
문제
나는 작은 성공을 감싸는 내 머리 주변의 기본적인 배관의 유형에 관여 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] -> Double
버 ex
, 하거나,또는 다형 버전이 필요합니까?
(제목에서 영감을 이와 유사한 질문)
해결책
지 알 ad
라이브러리이지만,이후 grad
예상한 기능의 유형 [AD s a] -> AD s a
그 첫 번째 매개 변수를 기대할 수 없습을 전달 할 수있는 기능의 유형 [Double] -> Double
, 이후 Double
고 AD
는 완전히 다른 유형이 있습니다.
일반 기능 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