2012-10-15 15 views
6

basic.hs:इस सरल प्रकार की परिभाषा के साथ क्या गलत है? (एक और तर्क के लिए उम्मीद ...)

areaCircle :: Floating -> Floating 
areaCircle r = pi * r * r 

कमांड:

*Main> :l basic.hs 
[1 of 1] Compiling Main    (Sheet1.hs, interpreted) 

Sheet1.hs:2:15: 
    Expecting one more argument to `Floating' 
    In the type signature for `areaCircle': 
     areaCircle :: Floating -> Floating 
Failed, modules loaded: none. 

मैंने देखा कि अपेक्षा के अनुरूप areaCircle :: Floating a => a -> a भार। उपर्युक्त संस्करण स्वीकार्य क्यों नहीं है?

उत्तर

19

क्योंकि आपका संस्करण वास्तव में एक प्रकार की आपूर्ति नहीं करता है। Floating एक प्रकार का वर्ग है। यदि आप किसी भी फ़्लोटिंग की अनुमति देना चाहते हैं, तो Floating a => a -> a सही है। अन्यथा आप Float -> Float या Double -> Double आज़मा सकते हैं।

बस इसे और अधिक मांसपेशियों के लिए: Floating a => a -> a न केवल यह कहता है कि आपका फ़ंक्शन किसी भी Floating प्रकार को स्वीकार करता है, लेकिन यह वही प्रकार देता है जो इसे पारित किया जाता है। यह भी सही होना चाहिए भले ही आप प्रकार को संकीर्ण करते हैं। उदाहरण के लिए, यदि आप कुछ अतिरिक्त रूपांतरण

12

Floating कर बिना Float -> Double उपयोग करने के लिए सक्षम नहीं होगा एक प्रकार नहीं है, यह एक प्रकार वर्ग है। आप एक प्रकार के वर्ग के रूप में एक प्रकार के रूप में उपयोग नहीं कर सकते हैं। जब आप हास्केल में Floating कहते हैं तो आप जोर दे रहे हैं कि निम्न प्रकार कक्षा का एक उदाहरण है। किसी भी प्रकार के a के लिए, अगर a वर्ग Floating का एक उदाहरण तो areaCircle करने के लिए a से एक समारोह के रूप में इस्तेमाल किया जा सकता है: तो, उदाहरण के लिए, आप जो आप के रूप में अनौपचारिक रूप से पढ़ सकते हैं के रूप में

areaCircle :: Floating a => a -> a 
areaCircle r = pi * r * r 

कोड लिख सकते हैं a

आप Floating को विशेषण की तरह थोड़ा सा सोच सकते हैं। यह प्रकारों का वर्णन करता है। लेकिन आप इसे एक संज्ञा, यानी इस्तेमाल करने की कोशिश कर रहे हैं। एक प्रकार के रूप में खुद के रूप में।

http://en.wikipedia.org/wiki/Type_class

संबंधित मुद्दे