2011-12-18 11 views
5

में प्रकार के बीच परिवर्तित मैं हास्केल में पाठ का एक केंद्रित स्ट्रिंग वापस जाने के लिए एक सरल समारोह बनाने की कोशिश कर रहा हूँ, लेकिन मैं मुसीबत सिर्फ दोनों ओर डालने के लिए कितना गद्दी पाने के आ रही है। मैं इस है:हास्केल

center padLength string = round ((padLength - (length string))/2) 

निम्नलिखित में से कौन त्रुटि देता है:

No instance for (Fractional Int) 
    arising from a use of '/' 
Possible fix: add an instance declaration for (Fractional Int) 
In the first argument of 'round', namely 
    '((padLength - (length string))/2)' 
In the expression: round ((padLength - (length string))/2) 
In an equation for `center': 
    center padLength string = round ((padLength - (length string))/2) 

मैं कैसे (मूल रूप से) एक डबल (मुझे लगता है कि) एक इंट से परिवर्तित कर सकते हैं?

उत्तर

9

समस्या नहीं है कि आप एक इंट करने के लिए एक डबल परिवर्तित नहीं कर सकते - round पूरा करता है कि ठीक है - यह है कि आप एक इंट (padLength - length string) पर विभाजन करने का प्रयास कर रहे हैं। त्रुटि संदेश सिर्फ आपको बता रहा है कि Int Fractional का उदाहरण नहीं है, संख्याओं के लिए टाइपक्लास जिसे विभाजित किया जा सकता है।

सामान्य तौर पर, आप इसे एक डबल में बदलने के लिए fromIntegral (padLength - length string) इस्तेमाल कर सकते हैं, लेकिन इस मामले में, आप बस सीधे पूर्णांक विभाजन का उपयोग कर सकते हैं:

center padLength string = padLength - (length string) `div` 2 

a `div` b सिर्फ div a b लेखन की एक अच्छे उपाय नहीं होता, आप इस तरह के एक बाइनरी ऑपरेटर के रूप में किसी भी समारोह का उपयोग कर सकते हैं।

+0

इसकी आवश्यकता क्यों है? मैं हास्केल –

+1

के लिए थोड़ा नया हूं मैंने अपने उत्तर में यह जानकारी जोड़ दी है :) – ehird

1

आप अभिन्न प्रकार के ऑपरेंड पर आंशिक विभाजन / उपयोग करने के लिए कोशिश कर रहे हैं, लेकिन यह परिभाषित नहीं है।

आप या तो (fromIntegral उपयोग करते हुए) को विभाजित करने से पहले ऑपरेंड डबल में बदलने का, या अभिन्न प्रभाग div उपयोग करना चाहिए।