मुझे एक फ़ंक्शन +++
चाहिए जो दो गणितीय वैक्टर जोड़ता है।हास्केल: एक सूची और एक ट्यूपल के बीच
मैं [x, y, z]
और उपयोग के रूप में वैक्टर लागू हो सकते हैं:
(+++) :: (Num a) => [a] -> [a] -> [a]
(+++) = zipWith (+)
और इस तरह किसी भी n आयामी वेक्टर (तो यह [x, y]
के लिए भी काम करेगा) को समायोजित।
या मैं (x, y, z)
और उपयोग के रूप में वैक्टर लागू हो सकते हैं:
type Triple a = (a, a, a)
merge :: (a -> b -> c) -> Triple a -> Triple b -> Triple c
merge f (a, b, c) (x, y, z) = (f a x, f b y, f c z)
(+++) :: (Num a) => Triple a -> Triple a -> Triple a
(+++) = merge (+)
बेशक
इस थोड़ा अधिक जटिल है, लेकिन यह जब मैं अन्य सभी वेक्टर कार्यों को लागू, कि अप्रासंगिक है (40 के बजाय 50 लाइनें)।
सूची दृष्टिकोण के साथ समस्या यह है कि मैं एक 3 डी वेक्टर के साथ 2 डी वेक्टर जोड़ सकता हूं। उस स्थिति में, zipWith
बस 3 डी वेक्टर के z
घटक को काट देगा। हालांकि यह समझ में आता है (अधिक संभावना है कि इसे 2 डी वेक्टर को [x, y, 0]
तक विस्तारित करना चाहिए), अन्य कार्यों के लिए मुझे लगता है कि यह चुपचाप होने के लिए समस्याग्रस्त हो सकता है। ट्यूपल दृष्टिकोण के साथ समस्या यह है कि यह वेक्टर को 3 घटकों तक सीमित करता है।
सहजता से, मुझे लगता है कि यह (x, y, z)
के रूप में वैक्टरों का प्रतिनिधित्व करने के लिए और अधिक समझदार होगा, क्योंकि गणितीय वेक्टर में निश्चित संख्या में घटक होते हैं और यह वास्तव में एक वेक्टर के लिए एक घटक (प्रीपेन्ड) को समझ में नहीं आता है।
दूसरी तरफ, हालांकि यह बहुत संभावना नहीं है कि मुझे 3 डी वैक्टर के अलावा कुछ भी चाहिए, लेकिन इसे सीमित करने के लिए यह सही नहीं लगता है।
मुझे लगता है कि मैं क्या चाहता हूं वह कार्य है जो बराबर लंबाई, या बेहतर की दो सूचियां लेता है, जो मनमानी आकार के tuples पर काम करता है।
व्यावहारिकता, मापनीयता, लालित्य इत्यादि के मामले में सुझाव सुझाव?
{-# LANGUAGE FlexibleInstances #-} -- needed to make tuples type class instances
class Additive v where
(+++) :: v -> v -> v
instance (Num a) => Additive (a,a) where
(x,y) +++ (ξ,υ) = (x+ξ, y+υ)
instance (Num a) => Additive (a,a,a) where
(x,y,z) +++ (ξ,υ,ζ) = (x+ξ, y+υ, z+ζ)
...
इस तरह, चर लंबाई tuples जोड़ा जा सकता है, लेकिन यह संकलन में सुनिश्चित किया जाएगा:
http: // stackoverflow।कॉम/प्रश्न/7220953/करता है-हैकेल-है-वैरैडिक-फ़ंक्शंस-टुपल्स –
मुझे पता है कि यह प्रश्न थोड़ा पुराना है, लेकिन आप [वेक्टर-स्पेस] (http: //hackage.haskell) पर एक नज़र डालना चाहते हैं .org/पैकेज/वेक्टर-स्पेस) पैकेज। –