adが3.4から4.*になってAPIが色々変わって使い方がよくわからなくなってしまった…… #Haskell  

例えば、AD.Mode.Reverseのgradの型が、3.4では (Traversable f, Num a) => (forall s. Mode s => f (AD s a) -> AD s a) -> f a -> f a だったのが、4.*では (Traversable f, Num a) => (forall s. Reifies s Tape => f (Reverse s a) -> Reverse s a) -> f a -> f a となっていて、ADに包んでいない生のモードの型になってしまっている。

それはまあいいのだけれど、内部でgradを使う関数が、gradに与える引数を受け取るときの型をどうするかが悩ましい。 

(forall s. Reifies s Tape => f (Reverse s a) -> Reverse s a) で受けようとすると、Tape型がNumeric.AD.Internal.Reverseからしかエクスポートされていないのが問題になり、それにReifiesを参照するのにreflectionへの直接の依存関係が出来てしまうのがちょっと嫌。

といって、 (forall s. (Mode s, Scalar s ~ Double) => f s -> s) で受けようとすると、 Mode s からは Fractional s 他の必要なインスタンスが導出されないため、それらの制約を Mode s に加えて明示的にリストしておく必要がある。