में निर्भर टाइपिंग की सीमाएं मैं थोड़ी देर के लिए हास्केल लिख रहा हूं लेकिन इडिस भाषा और निर्भर टाइपिंग के साथ कुछ प्रयोगों को आजमा देना चाहता था। मैंने थोड़ा सा खेला है, और मूल दस्तावेज़ पढ़ा है, हालांकि मैं फ़ंक्शन की एक निश्चित शैली को व्यक्त करना चाहता हूं, और यह नहीं जानता कि यह कैसे संभव है।इडिस
यहाँ मैं क्या पता करने के लिए किया जाए या नहीं व्यक्त किया जा सकता इच्छा के उदाहरण के एक जोड़े हैं:
पहले: एक समारोह है कि दो प्राकृतिक संख्या लेता है, लेकिन केवल चेकों टाइप करता है, तो पहले अन्य की तुलना में छोटा होता है। तो f : Nat -> Nat -> whatever
जहां nat1 nat2 से छोटा है। विचार यह है कि अगर f 5 10
जैसा कहा जाता है तो यह काम करेगा, लेकिन अगर मैंने इसे f 10 5
कहा है तो यह चेक टाइप करने में विफल रहेगा।
दूसरा: एक समारोह है कि एक स्ट्रिंग और तार कि केवल चेकों टाइप करता है, तो पहली स्ट्रिंग तार की सूची में है की एक सूची लेता है।
क्या इस तरह के कार्यों को इडिस में संभव है? यदि ऐसा है तो आप उल्लेख किए गए सरल उदाहरणों में से एक को कैसे कार्यान्वित करेंगे? धन्यवाद!
संपादित करें:
निम्नलिखित समाधान कार्यों में लिखा गया है कई उपयोगकर्ताओं की मदद से:
module Main
import Data.So
f : (n : Nat) -> (m : Nat) -> {auto isLT : So (n < m)} -> Int
f _ _ = 50
g : (x : String) -> (xs : List String) -> {auto inIt : So (elem x xs)} -> Int
g x xs = 52
main : IO()
main = putStrLn $ show $ g "hai" ["test", "yo", "ban", "hai", "dog"]
ये वर्तमान समाधान बड़े मामलों के लिए काम नहीं करते। उदाहरण के लिए यदि आप कुछ हजारों से ऊपर संख्याओं के साथ एफ चलाते हैं तो यह हमेशा के लिए लेता है (शाब्दिक रूप से नहीं)। मुझे लगता है कि ऐसा इसलिए है क्योंकि प्रकार की जांच वर्तमान में खोज आधारित है। एक उपयोगकर्ता ने टिप्पणी की कि सबूत लिखकर ऑटो को संकेत प्रदान करना संभव है। मान लीजिए कि इन साधारण मामलों में से किसी एक के लिए कोई सबूत कैसे लिखता है?
मैं इडिस से बहुत परिचित नहीं हूं लेकिन यह निश्चित रूप से संभव है। मैंने [stdlib] पर एक त्वरित नज़र डाली (https://github.com/idris-lang/Idris-dev/tree/master/libs/prelude/Prelude) - पहला कुछ होगा जैसे f: (nm: Nat) -> {isLT: Prelude.Nat.LT nm} -> एक्स' और दूसरा 'जी: (x: स्ट्रिंग) (xs: सूची स्ट्रिंग) -> {में: prelude.List.elem x xs = True} -> वाई'। (जहां '=' प्रस्तावसंगत समानता है, सुनिश्चित नहीं है कि प्रतीक इडिस इसका उपयोग करता है?) शायद अन्य, बेहतर एन्कोडिंग हैं, लेकिन ये केवल stdlib के साथ काम करते हैं। – user2407038
@ user2407038, [यह है] (http://docs.idris-lang.org/en/latest/tutorial/miscellany.html) '{ऑटो isLT: Prelude.Nat.LT एनएम}' और '{ऑटो इन: प्रीलूड लिस्ट.लेम एक्स एक्सएस = ट्रू} '। – user3237465
यह बहुत अच्छा @ user2407038 है, मुझे पता है कि जब मैं '' '50 50'' 'सबकुछ ठीक करता हूं। लेकिन जब मैं '500 500'' '' करता हूं तो यह कहता है कि इसे समाधान नहीं मिल रहा है। मुझे लगता है कि ऐसा इसलिए है क्योंकि यह कुछ मजबूर कर रहा है? क्या एक ही परिणाम होने का कोई तरीका है जो मैं चाहता हूं कि बड़ी संख्या में काम करता हो? –