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
toの型シグネチャを変更し[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
、それともポリモーフィック バージョンが必要ですか?
(この同様の質問に触発されたタイトル)