की विषमताएं नीचे वर्णित सभी प्रयोग जीएचसी 8.0.1 के साथ किए गए थे।गायब होने वाली बाधा का मामला: उच्च रैंक प्रकार
यह प्रश्न RankNTypes with type aliases confusion पर एक फॉलो-अप है। मुद्दा वहाँ इस तरह के कार्यों के प्रकार के लिए नीचे उबला हुआ ...
{-# LANGUAGE RankNTypes #-}
sleight1 :: a -> (Num a => [a]) -> a
sleight1 x (y:_) = x + y
... किस प्रकार चेकर द्वारा अस्वीकार कर दिया जाता है ...
ThinAir.hs:4:13: error:
* No instance for (Num a) arising from a pattern
Possible fix:
add (Num a) to the context of
the type signature for:
sleight1 :: a -> (Num a => [a]) -> a
* In the pattern: y : _
In an equation for `sleight1': sleight1 x (y : _) = x + y
... क्योंकि higher- रैंक बाधा Num a
cannot be moved outside of the type of the second argument (जैसा कि संभव होगा यदि हमारे पास a -> a -> (Num a => [a])
था)। इसलिए किया जा रहा है, हम एक चर पहले से ही पूरी बात से अधिक मात्रा निर्धारित करने के लिए एक उच्च रैंक बाधा जोड़ने की कोशिश कर अंत यही कारण है, वह यह है कि:
sleight1 :: forall a. a -> (Num a => [a]) -> a
इस सार-कथन किया के साथ, हम उदाहरण थोड़ा आसान बनाने के लिए कोशिश कर सकते हैं। के कुछ है कि Num
की आवश्यकता नहीं है के साथ (+)
की जगह है, और परिणाम की कि से समस्या पैदा करने वाले तर्क के प्रकार के संबंध तोड़ देना:
sleight2 :: a -> (Num b => b) -> a
sleight2 x y = const x y
यह सिर्फ तरह से पहले (काम नहीं करता त्रुटि में मामूली बदलाव के लिए बचाने के लिए संदेश):
ThinAir.hs:7:24: error:
* No instance for (Num b) arising from a use of `y'
Possible fix:
add (Num b) to the context of
the type signature for:
sleight2 :: a -> (Num b => b) -> a
* In the second argument of `const', namely `y'
In the expression: const x y
In an equation for `sleight2': sleight2 x y = const x y
Failed, modules loaded: none.
यहाँ const
का उपयोग करते हुए, हालांकि, शायद अनावश्यक है, इसलिए हम कार्यान्वयन खुद लिखने की कोशिश कर सकता है:
sleight3 :: a -> (Num b => b) -> a
sleight3 x y = x
आश्चर्य की बात है, यह वास्तव में काम करता है!
*Main> sleight3 1 "wat"
1
मैं कैसे कि सुगम बनाने के लिए के बारे में काफी यकीन नहीं है:
Prelude> :r
[1 of 1] Compiling Main (ThinAir.hs, interpreted)
Ok, modules loaded: Main.
*Main> :t sleight3
sleight3 :: a -> (Num b => b) -> a
*Main> sleight3 1 2
1
इससे भी अधिक बिज़ारेलि, वहाँ कोई वास्तविक Num
दूसरा तर्क पर बाधा हो रहा है। शायद हम कह सकते हैं, जैसे हम undefined
को तब तक जोड़ सकते हैं जब तक हम इसका मूल्यांकन नहीं करते हैं, एक असंतोषजनक बाधा एक प्रकार में बस ठीक हो सकती है जब तक कि इसे दाएं हाथ में कहीं भी एकीकरण के लिए उपयोग नहीं किया जाता है। हालांकि, यह एक बहुत ही कमजोर समानता की तरह लगता है, विशेष रूप से दिया गया है कि गैर-कठोरता के रूप में हम आमतौर पर समझते हैं कि यह मानों को शामिल करने वाली धारणा है, न कि प्रकार। इसके अलावा, यह हमें String
Num b => b
के साथ एकीकृत करता है - यह मानते हुए कि ऐसी चीज वास्तव में होती है, जो मुझे बिल्कुल यकीन नहीं है। तो, क्या एक बाधा प्रतीत होता है जब इस तरह से बाधा उत्पन्न होती है, तो क्या एक सटीक वर्णन है?
मुझे कुछ हद तक प्राकृतिक लगता है, उदाहरण के लिए 'x' प्रकार 'f :: ए -> (x -> बी) -> सी' में _positive_ (या covariant) स्थिति में। लगभग, 'f' बाहर से इसकी आवश्यकता के बजाय _provide_' x' का वादा कर रहा है। यह 'y :: सी ए => ए' तक बढ़ाया गया है। साथ ही, आप जिस प्रकार के 'y' का उपयोग करते हैं, जीएचसी को' ए 'प्रकार का मान प्राप्त करने के लिए एक शब्दकोश प्रदान करना होता है - इसलिए यह शिकायत करेगा कि आसपास कोई ऐसा शब्दकोश नहीं है। – chi
यह बहुत अजीब लगता है, मैं सहमत हूं। शायद, केवल जीएचसी निर्माताओं को पता है कि 'forall' के पीछे किस तरह का जादू होता है :) – Shersh
@chi सकारात्मक और नकारात्मक स्थितियों के मामले में समस्या को वास्तव में स्पष्ट रूप से स्पष्ट करना है। यह दिलचस्प है कि चीजें केवल यहां समझ में आती हैं कि अगर आप बाधाओं के अंतर्ज्ञानी दृश्य को कुछ प्रकार के प्रतिबंधित मात्रा के रूप में उभाराते हैं (उदाहरण के लिए "' Num a => a' 'num'' में कुछ प्रकार 'a' के लिए खड़ा है) और उन्हें देखना शुरू करें संक्षेप में, शब्दकोशों से कार्य। – duplode