मैं GADTs
को समझने की कोशिश कर रहा हूं, और मैंने जीएचसी के मैनुअल में GADTs example को देखा है। जहाँ तक मेरा बता सकते हैं, यह MultiParamTypeClasses
साथ एक ही बात करने के लिए संभव है:जीएडीटी बनाम मल्टीपार्म टाइप टाइप
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies,
FlexibleInstances, UndecidableInstances #-}
class IsTerm a b | a -> b where
eval :: a -> b
data IntTerm = Lit Int
| Succ IntTerm
data BoolTerm = IsZero IntTerm
data If p a = If p a a
data Pair a b = Pair a b
instance IsTerm IntTerm Int where
eval (Lit i) = i
eval (Succ t) = 1 + eval t
instance IsTerm BoolTerm Bool where
eval (IsZero t) = eval t == 0
instance (IsTerm p Bool, IsTerm a r) => IsTerm (If p a) r where
eval (If b e1 e2) = if eval b then eval e1 else eval e2
instance (IsTerm a c, IsTerm b d) => IsTerm (Pair a b) (c, d) where
eval (Pair e1 e2) = (eval e1, eval e2)
ध्यान दें, हम ठीक उसी निर्माणकर्ता और eval
के लिए ठीक उसी कोड है (प्रसार पार उदाहरण परिभाषाओं) में के रूप में है कि जीएचसी का GADTs
उदाहरण।
तो GADTs
के बारे में सभी फ़ज़ क्या है? क्या कोई ऐसी चीज है जो मैं GADTs
के साथ कर सकता हूं कि मैं MultiParamTypeClasses
के साथ नहीं कर सकता? या क्या वे सिर्फ उन चीजों को करने का एक संक्षिप्त तरीका प्रदान करते हैं जिन्हें मैं MultiParamTypeClasses
के साथ कर सकता हूं?
अपने नमूने में आप 'अगर (लिट 3) (इंटर्म 1) (इंटर्म 2) 'बनाने में सक्षम हैं। 'डेटा का उपयोग करने पर विचार करें यदि एक = यदि बूलटर्म ए 'है। – ony
जीएडीटी ऐसी किसी भी चीज की पेशकश नहीं करता है जिसे अस्तित्वहीन प्रकारों द्वारा अनुकरण नहीं किया जा सके और समानता टाइप करें। लेकिन आपका विशेष उदाहरण इसका उदाहरण नहीं है। – augustss
परिभाषा समय पर जीएडीटी बंद हैं, जो एक बहुत बड़ा अंतर हो सकता है। –