8

में हल ओवरलैपिंग उदाहरणों मैं एक मॉड्यूल भी कि accelerate पुस्तकालय से आयात करता है में टाइप Tagged s b (Data.Tagged) की show कुछ करने की कोशिश कर रहा हूँ। दुर्भाग्य से, में तेजी लाने के पुस्तकालय शो उदाहरण Data.Array.Accelerate.Pretty.hs मेंबाहरी पुस्तकालय

instance Kit acc => Show (acc aenv a) where 

परिभाषित करता है। थोड़ा सा पढ़ना, इस उदाहरण को आयात करने से बचने के लिए मैं कुछ भी नहीं कर सकता, जो स्पष्ट रूप से डेटा के साथ ओवरलैप करता है। Show उदाहरण के साथ। वास्तव में, जेनेरिक त्वरित उदाहरण मुझे *->*->* के कुछ भी प्रिंट करने से रोकता है।

यहाँ एक सरल उदाहरण है कि समस्या को दर्शाता है है:

{-# LANGUAGE FlexibleContexts, OverlappingInstances, IncoherentInstances #-} 

import Data.Array.Accelerate 
import Data.Tagged 

main :: (Show (Tagged Int Int)) => IO() 
main = let x = Tagged 3 
    in print (x::Tagged Int Int) 

त्रुटि:

  1. मैंने सोचा था कि OverlappingInstances मुझे हल करने की अनुमति होगी:

    Overlapping instances for Show (Tagged * Int Int) 
         arising from a use of `print' 
        Matching instances: 
         instance Show b => Show (Tagged k s b) -- Defined in `Data.Tagged' 
         instance [overlap ok] accelerate-0.13.0.5:Data.Array.Accelerate.Trafo.Base.Kit 
              acc => 
             Show (acc aenv a) 
        -- Defined in `Data.Array.Accelerate.Pretty' 
    

    मैं कुछ प्रश्न हैं उदाहरण, लेकिन मुझे एक ही त्रुटि मिलती है।

  2. IncoherentInstancesनिश्चित रूप से मुझे संकलित करने दें ... सही? लेकिन ऐसा नहीं है।
  3. क्यों GHC रिपोर्ट Data.Tagged Show (Tagged k s b) के रूप में उदाहरण दिखाता है जब उदाहरण (Data.Tagged से नकल) है:

    instance Show b => Show (Tagged s b) where 
    

मेरा मानना ​​है कि मैंने देखा है, जहां मैं केवल सक्षम था पहले एक स्पष्ट प्रकार हस्ताक्षर जोड़कर ओवरलैपिंग उदाहरणों को हल करने के लिए (सबसे विशिष्ट उदाहरण चुनने के लिए जीएचसी को मजबूर करने के लिए), लेकिन जैसा कि मेरा उदाहरण शीर्ष स्तर पर है और इसमें कोई बहुरूपता शामिल नहीं है, मुझे नहीं पता कि मैं कितना स्पष्ट हो सकता हूं प्रकार के।

मेरे धारणा के बाद से (मुझे लगता है कि) TaggedAccelerate.Base.Kit का एक उदाहरण उदाहरण की कमी को पूरा नहीं करता (मैं जानता हूँ कि हम केवल के आरएचएस पर मेल नहीं है और इसलिए है कि GHC Data.Tagged उदाहरण चयन करने में सक्षम होना चाहिए उदाहरण के लिए, लेकिन GHC यह पता लगाने की है कि उदाहरणों में से एक संभवतः लागू नहीं कर सकता है सक्षम होना चाहिए ...)

संपादित

मैं एक बग रिपोर्ट here बनाया है, और अपमानजनक उदाहरण अब निकाल दिया जाता है रेपो हेड में। नीचे # 3 का एक बड़ा जवाब है, लेकिन मुझे अभी भी यह जानने में दिलचस्पी है कि क्यों OverlappingInstances/IncoherentInstances काम नहीं किया।

उत्तर

5

मैं केवल 3.

का जवाब जानने के लिए एक प्रकार -XPolyKinds साथ संकलित किया गया है जब और एक प्रकार चर के प्रकार पर कोई प्रतिबंध नहीं, GHC प्रकार प्रिंट बहुत बुरी तरह से। प्रकार के नाम के बाद, यह सभी पॉलीमोर्फिक प्रकार चर के प्रकारों की एक सूची मुद्रित करता है, फिर प्रकार चर। तो टाइप हस्ताक्षर में दिखाए गए k का अर्थ है कि प्रकार परिवर्तनीय s किसी भी प्रकार का हो सकता है। (जिस तरह से इसका उपयोग किया जाता है, b में * होना चाहिए, इसलिए यह दयालु-बहुलक नहीं है, इसलिए इसकी तरह सूचीबद्ध नहीं है।)

यह कैसे हास्यास्पद प्राप्त कर सकते हैं का एक उदाहरण के रूप में, यहाँ एक पुस्तकालय की हेडेक डॉक्स से एक उदाहरण मैं अब काम कर रहा हूँ है ..

(SingI Nat a, SingI Nat b, SingI Nat c, SingI Nat d, SingI Nat e) => StaticSize ((,,,,) Nat Nat Nat Nat Nat) ((,,,,) Nat Nat Nat Nat Nat a b c d e) 

यह एक पदोन्नत 5 टपल, भी उपयोग कर रहा है। यह सिर्फ इसे अतिरिक्त-मूर्ख बनाता है, क्योंकि इसका मतलब है कि टुपल दोनों प्रकार और प्रकार में दिखाई देता है।

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