Başımı, ad
paketinde yer alan türlerin temel sıhhi tesisatının etrafına sarmakla ilgili küçük bir başarı yaşıyorum. Örneğin, aşağıdaki mükemmel çalışıyor: Ben [Double] -> Double
için ex
tipi imzasını değiştirip aynı şeyi denersenizNumeric.AD işlevlerinde kabul edilebilir türler
grad
:: (Num a, Traversable f) =>
(forall (s :: * -> *). Mode s => f (AD s a) -> AD s a)
-> f a -> f a
, ben
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
olsun:
grad
türü vardır
import Numeric.AD
ex :: Num a => [a] -> a
ex [x, y] = x + 2*y
> grad ex [1.0, 1.0]
[1.0, 2.0]
türündetüründe herhangi bir tür yapıcı ile Double
değiştirilirken aynı davranış oluşur. Num
'u başlatan. Traversable f
bir listesi olduğu zaman
, grad
ilk argümanı olarak kabul edilebilir bir Mode
türünü [AD s a] -> AD s a
olmalıdır - örneğin, Reverse
. Ama açıkça grad
kullanıcısı, AD
yapıcısını veya Mode
doğrudan ilgilenmek zorunda kalmaz. Bu içsellere bakmak beni biraz şaşırttı; Özellikle, Num a => [a] -> a
ve [Double] -> Double
arasındaki fark için tür/tür iz takip edemiyorum.
[Double] -> Double
tür imzası neden grad
ile sorunlara neden oluyor? Ve sade eski kütüphane kullanımı açısından: ex
'un [Double] -> Double
versiyonunu kullanmanın herhangi bir yolu var mı, yoksa gerekli bir polimorfik versiyon mu?
(this similar question esinlenerek başlık)
Ahhhh gibi bir imza vermeniz gerekiyor, bu yüzden AD '' Num' örneğidir. Örnekler listesinde fark edemedim, ama şimdi onu görüyorum. – jtobin
Ayrıca, eğer diğer veri yapılarında Çiftler diye yalan söyleyen bazı sabitleriniz varsa, bunların, AD'nin Çift bağımsız değişkenleri ve sonuçları ile etkileşimde bulunabilmeleri için, Numeric.AD.Types.lift veya Mode'daki diğer birleştiricileri kullanmanız gerekebilir. . –