2010-01-15 13 views
8

मैं इस प्रकार एक समारोह प्रोटोटाइप है कहो? मुझे पैरामीटर को [int] से क्या बदलना होगा ..? इस निष्पक्ष पल में यह func [-1, -2] के साथ काम करता है, मैं केवल इसे [1,2] के साथ काम करना चाहता हूं, यानी त्रुटि संदेश को हल करने वाले दुभाषिया के साथ।गैर नकारात्मक पूर्णांक

उत्तर

4

क्या आपने http://hackage.haskell.org/package/non-negative को आजमाया है?

+0

मुझे उम्मीद है कि किसी को कैसे प्रकार के साथ ऐसा करने के लिए, यह दिखाएगा लेकिन अब मैं देख सकता हूँ कि यह असंभव है - के लिए टिप्पणी से:, Word प्रकार होगा चुपचाप अधःप्रवाह एक अपवाद फेंकने के बिना - हालांकि, चेतावनी दी NonNegative.C प्रकार वर्ग गैर-ऋणात्मक में: "इस वर्ग के उदाहरणों को गैर-ऋणात्मक मान सुनिश्चित करना चाहिए। हम इसे प्रकार से लागू नहीं कर सकते हैं, लेकिन प्रकार की कक्षा की बाधा NonNegative.C प्रकारों के आकस्मिक उपयोग से बचाती है जो नकारात्मक संख्याओं की अनुमति देती है।" कितना निराशाजनक है :-) – liwp

1

आप Peano numbers का उपयोग कर सकते हैं, अपने फ़ंक्शन के प्रकार को [Peano] -> ... पर बदल सकते हैं। लेकिन फिर आपको पूर्णांक से पेनो नंबरों में रूपांतरण फ़ंक्शन जोड़ना होगा और जब भी आप अपना फ़ंक्शन कॉल करेंगे।

या आप एक क्रम की जांच जोड़ सकते हैं:

func xs 
    | any (< 0) xs = error "only non-negative integers allowed as input" 
    | otherwise  = ... 

ध्यान दें कि बाद के समाधान अपने समारोह strict बनाता है।

7
newtype NonNegative a = NonNegative a 

toNonNegative :: (Num a, Ord a) => a -> NonNegative a 
toNonNegative x 
    | x < 0 = error "Only non-negative values are allowed." 
    | otherwise = NonNegative x 

fromNonNegative :: NonNegative a -> a 
fromNonNegative (NonNegative x) = x 

बस गैर-रचनात्मक कन्स्ट्रक्टर का कभी भी उपयोग करने के लिए सावधान रहें। यदि आप इसे एक अलग मॉड्यूल में डालते हैं और इसे निर्यात नहीं करते हैं तो यह आसान होगा।

इसके अलावा, अब आप संख्याओं की सूची को आलसी रूप से बदलने के लिए (मानचित्र को नॉननेटिवेटिव) का उपयोग कर सकते हैं।

जहां भी आप कच्चे नंबर इंजेक्ट करते हैं, तब भी इसे रनटाइम चेक की आवश्यकता होगी।

वैकल्पिक रूप से, आप Data.Word का उपयोग कर सकते हैं।

0

संस्करण के साथ आधार पैकेज में> = 4.8.0.0, जो GHC 7.10.1 में शामिल है और इसके बाद के संस्करण, वहाँ अब एक प्रकार Natural जो आप क्या चाहते हैं करता है - तुम सिर्फ करने के लिए अपने कोड बदल सकते हैं:

import Numeric.Natural (Natural) 

func :: [Natural] -> [Int] 

यह है, तथापि, Int करने से Integer के करीब, की तरह है क्योंकि Integer और Int के विपरीत, यह कोई अधिकतम मूल्य है।

क्योंकि Natural, Integer की तरह, Num और Integral का एक उदाहरण है, सभी एक ही अंकगणितीय आपरेशनों और रूपांतरण कार्यों आप Integer साथ मिल के रूप में उपलब्ध हैं। ऋणात्मक Natural की गणना करने के प्रयास रनटाइम पर Underflow फेंक देंगे, जो ArithException है। इसके अलावा, आसानी से, आप एक Natural सिर्फ एक पूर्णांक शाब्दिक का उपयोग कर, बना सकते हैं एक रूपांतरण के बिना:

GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help 
Prelude> :m +Numeric.Natural 
Prelude Numeric.Natural> 2 :: Natural 
2 

हालांकि, अगर आप निश्चित-आकार पूर्णांकों का डोमेन में रहना पसंद करते हैं, वहाँ उस के लिए एक समाधान है, भी - और यह बहुत लंबे समय तक रहा है - Wordthe module Data.Word से (जिसमें 8-बिट गैर-ऋणात्मक पूर्णांक के लिए Word8 भी शामिल है)। आप Word का उपयोग Natural पर उसी तरह करेंगे।

GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help 
Prelude> :m +Data.Word 
Prelude Data.Word> 2 :: Word 
2 
Prelude Data.Word> it - 4 
18446744073709551614 
संबंधित मुद्दे