vector-spaceパッケージにもう一度問題があります。私は最近のpostの@mnishから非常に有益な回答を受けましたが、そこではただ1つの変数に依存する関数しか扱っていませんでした。私が持っているとき、例えば、2つの変数に依存ベクトル空間パッケージを使用した多変数関数とそれに対応するヤコビアンの導関数
f:(0,oo) x [0,2pi] -> R²
(r,phi) -> (r*cos(phi),r*sin(phi))
をcartesiansする極座標からマップする関数を何が起こる 。
私はかなりナイーブなアプローチで、これを試してみました:
次のエラーpolar :: Double -> Double -> ((Double,Double) :~> (Double,Double))
polar r phi = \(r,phi) -> (((idD) r)*cos(idD phi),((idD) r)*sin(idD phi))
私が取得:
polarx :: Double -> Double -> ((Double,Double) :~> Double)
polarx r phi = \(r,phi) -> ((idD) r)*cos(idD phi)
私は
を得るCouldn't match expected type `(Double, Double) :> (Double, Double)'
with actual type `(t0, t1)'
In the expression:
(((idD) r) * cos (idD phi), ((idD) r) * sin (idD phi))
In the expression:
\ (r, phi)
-> (((idD) r) * cos (idD phi), ((idD) r) * sin (idD phi))
In an equation for `polar':
polar r phi
= \ (r, phi)
-> (((idD) r) * cos (idD phi), ((idD) r) * sin (idD phi))
一つの成分について
Couldn't match expected type `Double'
with actual type `(Double, Double)'
Expected type: (Double, Double) :> Double
Actual type: (Double, Double) :> (Double, Double)
In the return type of a call of `idD'
In the first argument of `(*)', namely `((idD) r)'
明らかに何らかのタイプの障害がありますが、何が間違っているかわかりません。
このようなマッピングのヤコビ行列を計算したいときに、別の疑問が生じます。その名前が示唆するように、リニアマップとは何かがあります。もちろん、リニアマップはパッケージによってカバーされていますが、実際にはそれらのマップに基づいています。しかし、私のハスケルの知識は、私自身で解決策を導くには不十分です。
私はConalの非常にエレガントな自動微分定式化の重要な制限は、単一軸に沿って導関数にしか作用しないということです。 Jacobiansなどが欲しい場合は、ekmettの広告パッケージを使用してください:http://hackage.haskell.org/package/ad-1.3.0.1 – sclv
ありがとう@sclv、私はこのモジュールを調べました。うわー、私は感銘を受けたでしょう。私はこのパッケージに気付きませんでした。これを指摘してくれてありがとうございます。 – TheMADMAN
あなたは一人ではありません - 私は多次元タイプがどのように適合しているかを理解するのに苦労しています。私は「美しい差別化」という論文を読んで、それがいくつかの光を放つことを祈っています - 広告パッケージは、タイプ上かなりシンプルに見えます! – Oliver