3

Haskell で非線形制御の問題に自動微分を使用しようとしていますが、動作させるのに問題があります。私は基本的にcost、初期状態を考慮して最適化する必要がある関数を持っています。タイプは次のとおりです。

data Reference a = Reference a deriving Functor
data Plant a = Plant a deriving Functor

optimize :: (RealFloat a) => Reference a -> Plant a -> [a] -> [[a]]
optimize ref plant initialInputs = gradientDescent (cost ref plant) initialInputs

cost :: (RealFloat a) => Reference a -> Plant a -> [a] -> a
cost = ...

これにより、次のエラー メッセージが表示されます。

Couldn't match expected type `Reference
                                (Numeric.AD.Internal.Reverse.Reverse s a)'
            with actual type `t'
  because type variable `s' would escape its scope
This (rigid, skolem) type variable is bound by
  a type expected by the context:
    Data.Reflection.Reifies s Numeric.AD.Internal.Reverse.Tape =>
    [Numeric.AD.Internal.Reverse.Reverse s a]
    -> Numeric.AD.Internal.Reverse.Reverse s a
  at test.hs:13:5-50
Relevant bindings include
  initialInputs :: [a] (bound at test.hs:12:20)
  ref :: t (bound at test.hs:12:10)
  optimize :: t -> t1 -> [a] -> [[a]] (bound at test.hs:12:1)
In the first argument of `cost', namely `ref'
In the first argument of `gradientDescent', namely
  `(cost ref plant)'

エラーを正しく理解しているかどうかさえわかりません。の型refとが への最初の引数のスコープ内にある にplantアクセスする必要があるということですか?sgradientDescent

これを機能させることは可能ですか?解決策を探しているときに、問題を最小限の例に減らしてみたところ、次の定義で同様のエラー メッセージが生成されることがわかりました。

optimize f inputs = gradientDescent f inputs 

optimize = gradientDescentエラーが発生しないため、これは奇妙に思えます。

4

1 に答える 1