2013-02-28 13 views
9

का जिक्र करते हुए मैं अपने कोड में कुछ स्थानीय कार्यों में प्रकार हस्ताक्षर जोड़ना चाहता हूं। हालांकि, उनके प्रकारों में अज्ञात, अस्तित्व में बाध्य प्रकार चर शामिल हैं। चूंकि वे अज्ञात हैं, मुझे नहीं पता कि एक प्रकार के हस्ताक्षर कैसे लिखना है। मैं इस प्रकार के चर का उल्लेख कैसे कर सकता हूं?एक अस्तित्व प्रकार परिवर्तनीय

निम्न उदाहरण में, go टाइप [b] -> Int -> Int, जहां b प्रकार पैटर्न मैच T (x_shared:xs) g से बंधे है। इसके लिए मैं किस प्रकार का हस्ताक्षर लिख सकता हूं?

data T = forall a. T [a] (a -> a -> Int) 

f :: T -> Int 
f (T (x_shared:xs) g) = go xs 0 
    where 
    -- go :: what type? 
    go (x:xs) n = go xs $! n + g x_shared x 
    go []  n = n 
+0

आप इस उपयोगी mightfind: http://stackoverflow.com/questions/13828602/outer-bound-type-declarations-without-scopedtypevariables –

उत्तर

15

ScopedTypeVariables विस्तार के साथ, आप g करने के लिए एक प्रकार का टिप्पणी जोड़ने और प्रकार चर a गुंजाइश के लिए लागू कर सकते हैं।

f (T (x_shared:xs) (g :: a -> a -> Int)) = go xs 0 

तो फिर तुम a साथ go के लिए एक प्रकार हस्ताक्षर लिख सकते हैं।

go :: [a] -> Int -> Int 
+3

मैं नहीं जानता था कि आप पैटर्न में प्रकार चर परिचय सकता है! आप जानते हैं कि हर दिन कुछ पता था, मुझे लगता है। –

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