7

Numeric.AD とカスタム Expr タイプを使用しようとしています。ユーザー入力式のシンボリック勾配を計算したいと思います。定数式を使用した最初の試行はうまく機能します。

calcGrad0 :: [Expr Double]
calcGrad0 = grad df vars
  where
   df [x,y] = eval (env [x,y]) (EVar "x"*EVar "y")
   env vs = zip varNames vs
   varNames = ["x","y"]
   vars = map EVar varNames

これは機能します:

>calcGrad0
[Const 0.0 :+ (Const 0.0 :+ (EVar "y" :* Const 1.0)),Const 0.0 :+ (Const 0.0 :+ (EVar "x" :* Const 1.0))]

ただし、式をパラメーターとして引き出すと、次のようになります。

calcGrad1 :: [Expr Double]
calcGrad1 = calcGrad1' (EVar "x"*EVar "y")
calcGrad1' e = grad df vars
  where
   df [x,y] = eval (env [x,y]) e
   env vs = zip varNames vs
   varNames = ["x","y"]
   vars = map EVar varNames

私は得る

Could not deduce (a ~ AD s (Expr a1))
from the context (Num a1, Floating a)
  bound by the inferred type of
           calcGrad1' :: (Num a1, Floating a) => Expr a -> [Expr a1]
  at Symbolics.hs:(60,1)-(65,29)
or from (Mode s)
  bound by a type expected by the context:
             Mode s => [AD s (Expr a1)] -> AD s (Expr a1)
  at Symbolics.hs:60:16-27
  `a' is a rigid type variable bound by
      the inferred type of
      calcGrad1' :: (Num a1, Floating a) => Expr a -> [Expr a1]
      at Symbolics.hs:60:1
Expected type: [AD s (Expr a1)] -> AD s (Expr a1)
  Actual type: [a] -> a
In the first argument of `grad', namely `df'
In the expression: grad df vars

どうすればghcにこれを受け入れさせることができますか?

4

2 に答える 2

5

私の推測では、リフトExprを適用して anを anに変換するのを忘れていると思いますAD s Expr

広告パッケージを記号の微分に使用することに興味がある場合。Lennart Augustsson のtracedパッケージはうまく機能します。

于 2011-05-09T20:18:03.110 に答える
1

あなたの場合のように、GHCが有効な関数の型等価署名を推測できない場合、解決策は関数に型署名を与えることです。このライブラリへのインターフェイスがわかりません。ただし、正しい署名はcalcGrad1 :: (Num a, Floating a) => Expr a -> [Expr a].

于 2011-05-09T14:49:30.527 に答える