read
रूपहास्केल: पढ़ सकते हैं और टाइप हस्ताक्षर
read :: (Read a) => String -> a
प्रस्तावना में परिभाषित किया गया है और जैसे के रूप में इस्तेमाल किया जा सकता read "1" :: Int
।
अब एक समारोह
readOne :: (Read a) => [String] -> (a, [String])
readOne (x:xs) = (read x,xs)
साथ readOne ["1","foo"]
परिणाम (अपेक्षित रूप से) त्रुटि
Ambiguous type variable 'a' in the constraint:
'Read a' arising from a use of 'readOne' at :1:0-18
Probable fix: add a type signature that fixes these type variable(s)
लेकिन readOne ["1","foo"] :: Int
काम नहीं करता है में प्रयोग किया जाता है, जबकि
readOneInt :: [String] -> (Int, [String])
readOneInt = readOne
काम करता है बस ठीक है:
> readOneInt ["1", "foo"]
(1,["foo"])
तो: मैं कैसे readOneInt
की तरह एक नया कार्य को परिभाषित करने के बिना readOne
करने के लिए एक प्रकार हस्ताक्षर जोड़ सकते हैं?
आपको बहुत बहुत धन्यवाद! –
सावधान रहें! अंत में उदाहरण केवल ghci में काम करेगा क्योंकि 1 का प्रकार 'इंटीजर' में डिफॉल्ट किया गया है। यदि आप अभिव्यक्ति के प्रकार के लिए ghci से पूछते हैं (': t' के माध्यम से), तो आपको' (Num a, Read a) => (ए, [स्ट्रिंग]) प्राप्त होता है, जिसका पहले जैसा ही समस्या है। 'asTypeOf' यहां सहायता कर सकता है, जैसा कि 'asTypeOf (readOne [" 1 "," foo "]) (0 :: डबल, [] :: [स्ट्रिंग])' - जिसे मैं आमतौर पर बैकटिक्स में टाइप टाइप के रूप में लिखूंगा लेकिन SO दोगुनी से बचने वाली बैकटीक्स पसंद नहीं है। – yatima2975