5

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)

cevap

6

Ben ad kitaplığı bilmiyorum ama grad birinci parametresi olarak tip [AD s a] -> AD s a bir işlev bekliyor beri, bunu türde bir işlevi geçmek mümkün olmasını bekleyemezsiniz [Double] -> Double, Double ve AD'dan beri tamamen farklı türlerdir. Kullandığınız hesaplamalar için ex uzmanlaşmak istiyorsanız

Num kısıtlaması ile jenerik fonksiyon ex

ex :: (Mode s, Fractional a) => [AD s a] -> AD s a 

gibi bir şey için uzman alır, sizin çalışma örnekte bu nedenle kendisi de Num bir örneğidir AD çünkü işleri Çiftler,

+0

Ahhhh gibi bir imza vermeniz gerekiyor, bu yüzden AD '' Num' örneğidir. Örnekler listesinde fark edemedim, ama şimdi onu görüyorum. – jtobin

+2

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. . –

İlgili konular