में इंडेक्स का एक फ़ंक्शन लेता है। मैं इडिस में एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो वेक्ट के आकार को पार करके एक वेक्टर बनाता है और एक फ़ंक्शन इंडेक्स लेता है पैरामीटर में अब तक, मैं इस है:इडिस में, "वेक्ट जेनरेटर" फ़ंक्शन कैसे लिखना है जो पैरामीटर
import Data.Fin
import Data.Vect
generate: (n:Nat) -> (Nat -> a) ->Vect n a
generate n f = generate' 0 n f where
generate': (idx:Nat) -> (n:Nat) -> (Nat -> a) -> Vect n a
generate' idx Z f = []
generate' idx (S k) f = (f idx) :: generate' (idx + 1) k f
लेकिन मैं यह सुनिश्चित करें कि समारोह पैरामीटर में पारित केवल कम सूचकांक ले जा रहा है Vect के आकार की तुलना करना चाहते हैं। मैंने कोशिश की है कि:
generate: (n:Nat) -> (Fin n -> a) ->Vect n a
generate n f = generate' 0 n f where
generate': (idx:Fin n) -> (n:Nat) -> (Fin n -> a) -> Vect n a
generate' idx Z f = []
generate' idx (S k) f = (f idx) :: generate' (idx + 1) k f
लेकिन यह त्रुटि
Can't convert
Fin n
with
Fin (S k)
मेरा प्रश्न है साथ संकलन नहीं है: मैं संभव करने के लिए क्या चाहते है और कैसे?
मुझे अभी तक कोई जवाब नहीं है, लेकिन दो चीजें ध्यान दें: 1. यदि आप "गिनती" फ़ंक्शन को कार्यान्वित कर सकते हैं जो 'n: Nat' लेता है और वेक्टर' [FZ, ..., n-1] ', तो आप' map' का उपयोग करके अपना फ़ंक्शन बना सकते हैं। 2. वेक्टरों को रिवर्स करने के लिए एक फ़ंक्शन लिखना बहुत मुश्किल नहीं है, इसलिए यदि आप "गिनती" फ़ंक्शन लिखने का कोई तरीका समझ सकते हैं, तो आप इसके परिणाम को गिनने के लिए उलट सकते हैं। – dfeuer
एक और विचार (शायद बेहतर)। आप 'फिन एन' को 'फिन (एम + एन)' में हमेशा "कमजोर" कर सकते हैं। तो एक विचार एक तर्क के साथ काम करना और एक तर्क नीचे जा रहा है, और एक तर्क उनके योग को साबित करना सही है। – dfeuer