Monday 15 June 2015

haskell - Constraint kinds: Pass multiple constraints -


जब मेरे पास हैकेल में निम्न तरह का डेटा प्रकार है:

  डेटा A ctx = ए (एक forall ctx एक = & gt; एक - & gt; एक।)   

तब मैं कार्यों है कि इस डेटाप्रकार में किसी वर्ग के प्रकार के मूल्यों पर काम रख सकते हैं:

  & gt; ए (+3) :: ए संख्या एक (+3) :: ए न्यू :: ए न्यूम   

लेकिन क्या यह कार्य भी संभव है कि इस डेटैट में कई बाधाएं हैं? मैंने इसे करने की कोशिश की:

  & gt; : टी ((+ 3)। Succ) ((+ 3)। Succ) :: (Enum c, num c) = & gt; सी - & gt; सी & gt; : टी ए (। (+ 3) succ) :: ए (Enum, अंक) `Enum 'के लिए एक और तर्क की उम्मीद एक अभिव्यक्ति प्रकार हस्ताक्षर में: एक (Enum, अंक) एक्सप्रेशन में: ए ((+ 3)। Succ) :: ए (एन्यूम, संख्या)   

तो यह काम नहीं करता है यह मेरे लिए क्या करना संभव है, या यह असंभव है? मुझे पता है कि एक समाधान एक "डमी" डेटा प्रकार और एक प्रकार का परिवार का उपयोग करना होगा, लेकिन मैं ऐसा नहीं करना चाहता, अगर इसकी जटिलता के कारण एक और तरीका है इसके अलावा, मैं यह उदाहरण था कि मैं succ के बजाय (1) का इस्तेमाल कर सकता था, लेकिन ऐसे जटिल मामले हैं जहां सिर्फ एक वर्ग में ऐसा परिवर्तन संभव नहीं है।

मुझे एक से कई वर्गों में शामिल होने के विचार को सामान्य करने का एक तरीका मिल गया है। हालांकि यह उपयोग करने के लिए काफी अजीब है, यह काम करता है

  {- # भाषा ConstraintKinds # -} {- # भाषा EmptyDataDecls # -} {- # भाषा FlexibleContexts # -} {- # भाषा FlexibleInstances # -} {- # भाषा GADTs # -} {- # भाषा KindSignatures # -} {- # भाषा MultiParamTypeClasses # -} {- # भाषा OverlappingInstances # -} {- # भाषा RankNTypes # -} {- # भाषा ScopedTypeVariables # -} {- # भाषा TypeOperators # -} {- # भाषा UndecidableInstances # -} मॉड्यूल टेस्ट जहां आयात GHC.Exts डेटा (: & gt; + & LT; :) ctx1 ctx2 एक जहां C'C :: (ctx1 एक, ctx2 क) = & gt; (Ctx1: & gt; + को & lt ;: ctx2) एक डेटा (: ++ :) (ctx1 :: * - & gt; बाधा) (ctx2 :: * - & gt; बाधा) = सी क्लास Ctx2 c1 c2 एक जहां useCtx :: सी 1: ++: सी 2 - & gt; ए - & gt; ((सी 1: & gt; + & lt ;: c2) ए - & gt; बी) - & gt; ख उदाहरण (सी 1 ए, सी 2 ए) = & gt; सीटीएक्स 2 सी 1 सी 2 ए जहां उपयोग सीटीएक्स _ ए एफ एफ = एफ सी'सी एफसी :: (सीटीएक्स 2 एनएएम एन्यूम ए) = & gt; ए - & gt; एक एफसी a = useCtx (सी :: संख्या: ++: एन्यूम) एक $ \ सीसी - & gt; 3 + एक आंकड़ा A सीटीएक्स = ए {कॉल करें: एक के लिए एक। सीटीएक्स ए = & gt; ए - & gt; एक} मुख्य = प्रिंट $ कॉल (ए एफसी :: ए (सीटीएक्स 2 नाम एन्यूम) 3)   

सीटीएक्स 3, सीटीएक्स 4, को परिभाषित करने के लिए बाध्य उपनामों का उपयोग करना संभव है ...

No comments:

Post a Comment