5

मुझे 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] -> Doublegrad के साथ समस्या क्यों पैदा करता है? और सादे पुराने पुस्तकालय के उपयोग के संदर्भ में: के ex के संस्करण का उपयोग करने का कोई तरीका है, या एक बहुरूप संस्करण आवश्यक है?

(शीर्षक this similar question से प्रेरित)

उत्तर

6

मैं ad पुस्तकालय पता नहीं है, लेकिन जब से grad अपनी पहली पैरामीटर के रूप में प्रकार [AD s a] -> AD s a के एक समारोह की उम्मीद है, आप इसे प्रकार की एक समारोह पारित करने में सक्षम होने की उम्मीद नहीं कर सकते [Double] -> Double, Double और AD के बाद से पूरी तरह से अलग प्रकार हैं।

Num बाधा के साथ सामान्य समारोह काम करता है, क्योंकि AD खुद भी Num का एक उदाहरण है, इसलिए अपने काम करने के उदाहरण में, ex तरह

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

कुछ करने के लिए विशेष हो जाता है आप की गणना के लिए ex का उपयोग कर विशेषज्ञ चाहते हैं डबल्स, आपको इसे

ex :: Mode s => [AD s Double] -> AD s Double 
+0

अहह ठीक है, इसलिए 'एडी' 'न्यू' का उदाहरण है। मैं नोटिस करने में असफल रहा कि उदाहरण सूची में, लेकिन अब मैं इसे देखता हूं। – jtobin

+2

इसके अलावा, यदि आपके पास कुछ स्थिर संरचनाएं हैं, तो अन्य डेटा संरचनाओं में, आपको Numeric.AD.Types.lift या मोड में अन्य संयोजकों का उपयोग करने की आवश्यकता हो सकती है ताकि वे आपके एडी के डबल तर्क और परिणाम के साथ बातचीत कर सकें। । –

संबंधित मुद्दे