मुझे ad
पैकेज में शामिल प्रकारों की मूल नलसाजी के चारों ओर अपने सिर को लपेटने में बहुत कम सफलता हो रही है। उदाहरण के लिए, निम्नलिखित पूरी तरह से काम करता है:न्यूमेरिक.एडी कार्यों में स्वीकार्य प्रकार
import Numeric.AD
ex :: Num a => [a] -> a
ex [x, y] = x + 2*y
> grad ex [1.0, 1.0]
[1.0, 2.0]
जहां grad
प्रकार का है:
grad
:: (Num a, Traversable f) =>
(forall (s :: * -> *). Mode s => f (AD s a) -> AD s a)
-> f a -> f a
अगर मैं [Double] -> Double
करने के लिए ex
के प्रकार के हस्ताक्षर बदल सकते हैं और एक ही बात की कोशिश, मैं
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
वही व्यवहार तब होता है जब Double
कोके साथ प्रतीत होता हैजो Num
को तुरंत चालू करता है। , Reverse
जैसे -
जब Traversable f
एक सूची है, grad
का पहला तर्क प्रकार [AD s a] -> AD s a
कुछ स्वीकार्य Mode
के लिए होना आवश्यक है। लेकिन स्पष्ट रूप से grad
के उपयोगकर्ता को AD
कन्स्ट्रक्टर या Mode
से सीधे निपटने की ज़रूरत नहीं है। इन आंतरिकों में देखकर मुझे थोड़ा उलझन में छोड़ दिया है; विशेष रूप से, मैं Num a => [a] -> a
और [Double] -> Double
का उपयोग करने के बीच अंतर के प्रकार/प्रकार का निशान का पालन नहीं कर सकता।
टाइप हस्ताक्षर [Double] -> Double
grad
के साथ समस्या क्यों पैदा करता है? और सादे पुराने पुस्तकालय के उपयोग के संदर्भ में: के ex
के संस्करण का उपयोग करने का कोई तरीका है, या एक बहुरूप संस्करण आवश्यक है?
(शीर्षक this similar question से प्रेरित)
अहह ठीक है, इसलिए 'एडी' 'न्यू' का उदाहरण है। मैं नोटिस करने में असफल रहा कि उदाहरण सूची में, लेकिन अब मैं इसे देखता हूं। – jtobin
इसके अलावा, यदि आपके पास कुछ स्थिर संरचनाएं हैं, तो अन्य डेटा संरचनाओं में, आपको Numeric.AD.Types.lift या मोड में अन्य संयोजकों का उपयोग करने की आवश्यकता हो सकती है ताकि वे आपके एडी के डबल तर्क और परिणाम के साथ बातचीत कर सकें। । –