2011-08-29 20 views
9

के साथ अपेक्षित प्रकार (Int -> Int -> Int) से मेल नहीं खा सकता है, मैं एक नौसिखिया हूं और मैं यूनी में प्रवेश करने से पहले हास्केल पर कुछ ट्यूटोरियल करने की कोशिश कर रहा हूं कंप्यूटर विज्ञान।वास्तविक प्रकार `(टी 0, टी 1, टी 2) '

मैं इस कार्यक्रम में फंस गया। इसमें तीन संख्याएं होती हैं और उन्हें आरोही क्रम में रखती है। क्या कोई मेरी मदद कर सकता है और मुझे बता सकता है कि क्या गलत है क्योंकि यह मुझे पागल कर रहा है? आपके समय के लिए धन्यवाद।

import Prelude hiding (min,max) 
orderTriple :: (Int -> Int -> Int) -> (Int -> Int -> Int) 
max :: Int -> Int -> Int -> Int 
min :: Int -> Int -> Int -> Int 
middle :: Int -> Int -> Int -> Int 


max x y z 
|(x>=y) && (x>=z) = x 
|(y>=x) && (y>=z) = y 
|otherwise  = z 

min d e f 
|(d<=e) && (d<=f) = d 
|(e<=d) && (e<=f) = e 
|otherwise  = f 

middle g h i 
| (g <= (max g h i)) && (g >= (min g h i)) = g 
| (h <= (max g h i)) && (h >= (min g h i)) = h 
| otherwise     = i 

orderTriple (a,b,c) = ((min a b c),(middle a b c),(max a b c)) 

त्रुटि है:

orderList.hs:23:13: 
    Couldn't match expected type `[Int -> Int -> Int]' 
       with actual type `(t0, t1, t2)' 
    In the pattern: (a, b, c) 
In an equation for `orderTriple': 
    orderTriple (a, b, c) = [(min a b c), (middle a b c), (max a b c)] 
+0

आप वास्तव में कर रहे हैं का उपयोग एक अल्पविराम लेकिन एक टपल के तर्कों को अलग करने के (वास्तव में यह थोड़ा और अधिक परिष्कृत है), विश्वविद्यालय में हास्केल (या कुछ प्रकार का एफपी) करने जा रहा है? काश मैं अपने कार्यक्रम में मिला था! – MatrixFrog

उत्तर

6

आप संकलक गलत प्रकार की जानकारी दे:

orderTriple :: (Int -> Int -> Int) -> (Int -> Int -> Int) 

होना चाहिए

orderTriple :: (Int, Int, Int) -> (Int, Int, Int) 

पहले टाइपिंग का दावा है कि orderTriple परिवर्तित एक ऐसा फ़ंक्शन (दो इट्स से एक तक) किसी अन्य फ़ंक्शन में है, जो आपके कोड के अनुसार बिल्कुल नहीं है।

(इसके अलावा: सीएस प्रोग्राम के लिए तैयारी में एफपी का अध्ययन करने के लिए +1)।

+0

thx आपकी मदद के बारे में बहुत कुछ है लेकिन इस बार यह एक और त्रुटि : 1: 1: फ़ंक्शन 'ऑर्डर ट्रिपल' तीन तर्कों, पर लागू होता है लेकिन इसका प्रकार '(Int, Int, Int) -> (Int, Int, Int) 'में केवल एक अभिव्यक्ति में: ऑर्डर ट्रिपल 3 1 9 ' इसे 'के समीकरण में: यह = ऑर्डर ट्रिपल 3 1 9 – noobie

+0

' ऑर्डर ट्रिपल 'की परिभाषा एक टुपल की अपेक्षा करती है, अर्थात, अल्पविराम- कोष्ठक में अलग तर्क। आपको इसे इस तरह से कॉल करना होगा - 'ऑर्डर ट्रिप्स (3,1,9) '- तीन स्पेस से अलग (करीबी) तर्कों के बिना ब्रांड्स के बिना। –

+0

@noobie: आप यह भी जांचना चाहेंगे कि आप 'ऑर्डर ट्रिपल' की परिभाषा में वर्ग ['] के बजाय राउंड ब्रैकेट'() 'का उपयोग कर रहे हैं। आपके द्वारा दिया गया त्रुटि संदेश उपरोक्त कोड सूची से अलग है ... – yatima2975

2

एक तीर -> फ़ंक्शन के तर्कों को अलग करता है।

orderTriple :: (Int,Int,Int) -> (Int,Int,Int) 

अन्य प्रकार के मामले में, एक अंतरिक्ष के लिए पर्याप्त है:

Either String Int 
संबंधित मुद्दे