2017-11-03 10 views
7

को कम नहीं कर सकता निम्नलिखित कोड में, जीएचसी Monoidal इंस्टेंस की परिभाषा में फ़ंक्शन उदाहरण नहीं ढूंढ सकता है।सुपरक्लास

GHC क्यों बात का अनुमान लगाना नहीं है कि दियाApplicative बाधा संतुष्ट है, तो Functor कहीं पहले से ही हो गया है?

import Prelude hiding (Applicative (..), Monad (..)) 

class Functor f => Applicative f where 
    pure :: a -> f a 
    (<*>) :: f (a -> b) -> f a -> f b 

class Functor f => Monoidal f where 
    unit::f() 
    (*) ::f a -> f b -> f (a,b) 

instance Applicative f => Monoidal f where 
    unit = pure() 
    a * b = undefined 

मैं निश्चित रूप से Monoidal का सुस्पष्ट Functor f बाधा जोड़ सकता है कोई त्रुटि नहीं करने के लिए पता है, लेकिन मेरे सवाल का उदाहरण संकल्प कि जिस तरह से काम करता है क्यों के बारे में अधिक है (वहाँ इस तर्क 'क्षमता'? करने के लिए एक नाम है)

import Prelude hiding ((*), Applicative (..), Monad (..)) 

class Functor f => Applicative f where 
    pure :: a -> f a 
    (<*>) :: f (a -> b) -> f a -> f b 

class Functor f => Monoidal f where 
    unit::f() 
    (*) ::f a -> f b -> f (a,b) 

instance (Applicative f, Functor f) => Monoidal f where 
    unit = pure() 
    a * b = (pure (,) <*> a <*> b) 

instance (Monoidal f, Functor f) => Applicative f where 
    pure x = fmap (\_ -> x) unit 
    mu <*> mx = fmap (\(f, x) -> f x) ((mu * mx) :: f (a -> b, a)) 
+2

मुझे उम्मीद है कि यह स्पष्ट है कि इस तरह का एक उदाहरण बहुत समझ में नहीं आता है! - फिर भी, अच्छा सवाल है, मैं संकलक को यह अनुमति देने और सुपरक्लास को समझने के लिए भी मानता। – leftaroundabout

+0

जो रूट समस्या मैं देख रहा हूं वह यह है कि आपके पास "फंक्टर एफ => मोनोइडल एफ" और "आवेदक एफ => मोनोइडल एफ" दोनों हैं। जैसा कि मैं इसे समझता हूं, संकलक को किसी विशेष प्रकार के विशेष प्रकार के किसी विशेष प्रकार के लिए केवल एक संभावित व्युत्पन्न पथ देखने की आवश्यकता होती है। – NovaDenizen

+0

@ बाएंअराउंडबाउट क्योंकि यह एक आइसोमोर्फिज्म है और आगे यह है कि आपका क्या मतलब है? यही कारण है कि मैं – nicolas

उत्तर

3

मुझे एक बग की तरह लग रहा है। यहां एक न्यूनतम फ़ाइल है जो समस्या को दिखाती है और Prelude सामान या undefined एस नाम बदलने के साथ किसी भी शेंगेन पर भरोसा नहीं करती है।

{-# LANGUAGE FlexibleInstances #-} 
{-# LANGUAGE UndecidableInstances #-} 
class A x 
class A x => B x 
class A x => C x 
instance B x => C x 

मैं इस फ़ाइल के साथ जीएचसी बग ट्रैकर पर एक बग दर्ज करने की सिफारिश करता हूं (या इसे बहुत पसंद है); B x का पता लगाने के लिए आवश्यक तर्क A x संभव होना चाहिए।

+1

की याद दिलाने के लिए आईएसओ डालना था, मैंने इसे [TraC# 14417] (https://ghc.haskell.org/trac/ghc/ticket/14417) – dfeuer

+0

के रूप में रिपोर्ट किया है और यह निकला 8.0 के रूप में ज्ञात और आधिकारिक रूप से अपेक्षित व्यवहार होने के लिए। अजीब। – dfeuer

+2

और [यह टिप्पणी] (https://ghc.haskell.org/trac/ghc/ticket/11427#commentodev) इस व्यवहार से हल की गई समस्या को समझाते हुए, पैसे शॉट के रूप में प्रतीत होता है। हालांकि, यह काफी तकनीकी है। –

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