c++ सी++ के साथ उच्च प्रकार के प्रकार




templates haskell (2)

यह प्रश्न उन लोगों के लिए है जो हास्केल (या उच्चतर प्रकार के प्रकार का समर्थन करने वाली कोई अन्य कार्यात्मक भाषा) और सी ++ दोनों जानते हैं ...

क्या सी ++ टेम्पलेट्स का उपयोग करके उच्च प्रकार के प्रकारों को मॉडल करना संभव है? यदि हां, तो कैसे?

संपादित करें:

टोनी मॉरिस द्वारा this प्रस्तुति से:

उच्च-आदेश पॉलीमोर्फिज्म:

  • जावा और सी # जैसी भाषाओं में प्रथम क्रम पॉलीमोर्फिज्म है क्योंकि वे हमें प्रकारों पर सार तत्व बनाने की अनुमति देते हैं। उदाहरण के लिए List<A> में एक reverse फ़ंक्शन हो सकता है जो कि किसी भी तत्व प्रकार ( A ) पर काम करता है।

  • अधिक व्यावहारिक प्रोग्रामिंग भाषाएं और टाइप सिस्टम हमें प्रकार के रचनाकारों पर भी सार तत्वों की अनुमति देते हैं।

  • इस सुविधा को उच्च-आदेश (या उच्च-प्रकार) बहुरूपता कहा जाता है।

उदाहरण :

छद्म-जावा उच्च-आदेश polymorphism के लिए एक आविष्कार नोटेशन के साथ

interface Transformer<X, Y> {
  Y transform(X x);
}

interface Monad<M> { // M :: * -> *
  <A> M<A> pure(A a);
  <A, B> M<B> bind(Transformer<A, M<B>> t, M<A> a);
}

आमतौर पर एक सामान्य टेम्पलेट पहले से ही एक उच्च प्रकार का प्रकार नहीं है? उदाहरण के लिए std::vector std::vector<int> जैसे वास्तविक प्रकार को बनाने के लिए एक प्रकार पैरामीटर लेता है, इसलिए इसमें दयालु * -> *


टेम्पलेट टेम्पलेट पैरामीटर?

template <template <typename> class m>
struct Monad {
    template <typename a>
    static m<a> mreturn(const a&);

    template <typename a, typename b>
    static m<b> mbind(const m<a>&, m<b>(*)(const a&));
};

template <typename a>
struct Maybe {
    bool isNothing;
    a value;
};

template <>
struct Monad<Maybe> {
    template <typename a>
    static Maybe<a> mreturn(const a& v) {
        Maybe<a> x;
        x.isNothing = false;
        x.value = v;
        return x;
    }

    template <typename a, typename b>
    static Maybe<b> mbind(const Maybe<a>& action, Maybe<b>(*function)(const a&)) {
        if (action.isNothing)
            return action;
        else
            return function(action.value);
    }
};






higher-kinded-types