मैं प्रकार की एक समारोह के एक बुरी तरह गैर पैरामीट्रिक संस्करण लिखने के लिएबंद प्रकार के परिवारों पर बाधाएं?
pretty :: (Show a) => a -> Text
ऐसी है कि
pretty :: Text -> Text = id
pretty :: String -> Text = T.pack
pretty :: (Show a) => a -> Text = T.pack . show
तो विचार है कि कुछ भी पहले से ही एक Show
उदाहरण है कि चालू किया जा सकता है करना चाहते हैं Text
और String
को छोड़कर, जिसे हम विशेष मामले चाहते हैं, को छोड़कर show
द्वारा "सुंदर" Text
में।
निम्नलिखित कोड काम करता है:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, FlexibleContexts #-}
{-# LANGUAGE DataKinds, ConstraintKinds #-}
module Pretty (pretty) where
import Data.Text (Text)
import qualified Data.Text as T
type family StringLike a :: Bool where
StringLike String = True
StringLike Text = True
StringLike a = False
class (b ~ StringLike a) => Pretty' a b where
pretty' :: a -> Text
instance Pretty' String True where
pretty' = T.pack
instance Pretty' Text True where
pretty' = id
instance (Show a, StringLike a ~ False) => Pretty' a False where
pretty' = T.pack . show
type Pretty a = (Pretty' a (StringLike a))
pretty :: (Pretty a) => a -> Text
pretty = pretty'
और यह pretty
समारोह के अलावा कुछ निर्यात के बिना इस्तेमाल किया जा सकता।
हालांकि, मैं pretty
के लिए प्रकार हस्ताक्षर के बारे में भी खुश नहीं हूँ:
pretty :: (Pretty a) => a -> Text
मुझे लगता है कि जब से StringLike
एक बंद प्रकार परिवार है, वहाँ एक रास्ता GHC यह पता लगाने के लिए किया जाना चाहिए कि अगर केवल (Show a)
रखती है, (Pretty a)
पहले से ही संतुष्ट हो जाता है, के बाद से:
1. The following hold trivially just by substituting the results of applying StringLike:
(StringLike String ~ True, Pretty' String True)
(StringLike Text ~ True, Pretty' Text True)
2. For everything else, we *also* know the result of applying StringLike:
(Show a, StringLike a ~ False) => (Pretty' a (StringLike a))
वहाँ इस के GHC को समझाने के लिए कोई तरीका है?
ए 'हा हा हा हार्ट गंभीर' विचार सिर्फ मेरे लिए हुआ है जो 'प्रीलूड' योग्यता आयात करने के लिए है, और 'सुंदर' को 'शो' का नाम बदलना है ... – Cactus
"मुझे लगता है कि चूंकि स्ट्रिंगलाइक एक बंद प्रकार का परिवार है, इसलिए जीएचसी को यह पता लगाने का एक तरीका होना चाहिए कि अगर केवल (दिखाएं) धारण करता है," मुझे लगता है कि निम्नलिखित एक बड़ी समस्या है: 'स्ट्रिंगलाइक' एक तरह का प्रकार पैदा करता है (-लिफ्ट) 'बूल', 'शो' एक तरह का प्रकार 'प्रतिबंध' पैदा करता है। यह सिर्फ इतना नहीं है कि जीएचसी रिश्ते को समझ में नहीं आता है; वे वास्तव में तर्क के विभिन्न कानूनों का पालन करते हैं। उठाए गए 'बूल' के साथ, आप बहिष्कृत मध्य के कानून को मानते हैं, लेकिन 'प्रतिबंध' के साथ, आप उस पर भरोसा नहीं कर सकते हैं। –